Je sais que c'est probablement sur Internet quelque part, mais je ne trouve pas la réponse ici sur Stackoverflow, alors j'ai pensé que je pourrais augmenter un peu la base de connaissances ici.
Je suis un débutant à Ruby et Rails mais mon entreprise y investit assez donc j'essaie de le connaître un peu plus) détail.
Il m'a été difficile de changer mon état d'esprit pour concevoir une application à partir du "modèle" plutôt que de la base de données, donc j'essaie de comprendre comment ferait tout le travail de conception que j'ai fait classiquement dans la base de données dans le Rails modèle à la place.
Donc, la tâche la plus récente que je me suis donnée est de comprendre comment configurer un modèle de base de données Rails pour effectuer des suppressions en cascade? Y a-t-il un moyen facile de le faire? Ou devrais-je aller dans le MySql et configurer cela?
vous pouvez également définir l'option: dependante sur: delete_all. : delete_all émettra une seule instruction SQL pour supprimer tous les enregistrements enfants. à cause de cela, l'utilisation de: delete_all peut vous donner de meilleures performances.
has_many :memberships, dependent: :delete_all
Ouais tu peux, si tu utilises une relation comme has_many tu fais juste ça
has_many :memberships, dependent: :destroy
Contrairement à la réponse fournie, je suggère fortement de le faire également au niveau de la base de données. Dans le cas où vous avez différents processus ou un environnement multi-thread, il peut arriver que les enregistrements ne soient pas correctement supprimés. De plus, la clé étrangère de la base de données accélère considérablement la suppression de nombreuses données.
Comme dans la réponse suggérée, procédez comme suit:
has_many :memberships, dependent: :delete_all
Cependant, assurez-vous également de configurer un foreign_key
dans une migration. De cette façon, la base de données se charge de supprimer automatiquement les enregistrements pour vous.
Pour annuler les valeurs lorsqu'un membre est supprimé, en supposant que vous disposez d'un modèle utilisateur:
add_foreign_key :users, :memberships, on_delete: :nullify
Vous pouvez également supprimer tous les modèles chaque fois qu'un abonnement est supprimé
add_foreign_key :users, :memberships, on_delete: :cascade
Gardez simplement à l'esprit que delete_all n'exécutera aucun rappel (comme before_destroy et after_destroy) sur les enregistrements enfants.
Il semble que ce plugin puisse vous donner ce que vous recherchez si vous souhaitez que les suppressions en cascade se reflètent dans la structure de la base de données réelle:
http://www.redhillonrails.org/foreign_key_migrations.html
Le format pour l'utiliser dans une migration serait quelque chose comme ceci:
create_table :orders do |t|
t.column :customer_id, :integer, :on_delete => :set_null, :on_update => :cascade
...
end