Je sais que c'est probablement quelque part sur Internet, 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 dans Ruby and Rails, mais mon entreprise s'y investit beaucoup, j'essaie donc de la connaître un peu plus en détail.
Il a été difficile pour moi de changer mon état d'esprit en concevant 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 Modèle de rails à la place.
La tâche la plus récente que je me suis donc donnée est de savoir comment configurer un modèle de base de données Rails pour effectuer des suppressions en cascade? Y at-il un moyen facile de le faire? Ou devrais-je entrer dans MySql et configurer cela?
la source
:delete_all
et:destroy
pour cela. Les deux entraîneront la suppression des appartenances enfants (1 niveau pour delete [citation nécessaire] etn
pour destroy (si leurs enfants ont des destructions dépendantes)) à être supprimées de la base de données, mais:destroy
instancieront chaque objet enfant et exécuteront d'abord les rappels, alors:delete_all
que Instruction SQL DELETE dans la base de données.:destroy
est plus lent à cause de cela, mais cela vous permet d'avoir des rappels lorsqu'un enregistrement est détruit. Contournement des rails à une extrémité et instanciation potentielle n ^ x de l'autreOuais tu peux, si tu utilises une relation comme has_many tu fais juste ça
has_many :memberships, dependent: :destroy
la source
Contrairement à la réponse fournie, je suggère fortement de le faire également au niveau de la base de données. Si vous avez différents processus ou un environnement multithread, il se peut 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 beaucoup de 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'une appartenance est supprimée, 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
la source
delete_all
dans le modèle. La clé étrangère se chargera de tout supprimer correctement pour vous au niveau de la base de données.Gardez simplement à l'esprit que delete_all n'exécutera aucun rappel (comme before_destroy et after_destroy) sur les enregistrements enfants.
la source
Il semble que ce plugin puisse vous donner ce que vous recherchez si vous voulez que les suppressions en cascade reflètent la structure réelle de la base de données:
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
la source