web-dev-qa-db-fra.com

Puis-je configurer la suppression en cascade dans Rails?

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?

77
matt_dev

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
94
Mike Breen

Ouais tu peux, si tu utilises une relation comme has_many tu fais juste ça

has_many :memberships, dependent: :destroy
64
danmayer

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
20
Hendrik

Gardez simplement à l'esprit que delete_all n'exécutera aucun rappel (comme before_destroy et after_destroy) sur les enregistrements enfants.

10
Jarin Udom

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
6
Sean McMains