Effacer en Cascade en Ruby ActiveRecord modèles?
J'ai été à la suite de la vidéo sur rubyonrails.org (création du blog).
J'ai des modèles suivants:
commentaire.rb
class Comment < ActiveRecord::Base
belongs_to :post
validates_presence_of :body # I added this
end
post.rb
class Post < ActiveRecord::Base
validates_presence_of :body, :title
has_many :comments
end
Des Relations entre les modèles fonctionnent très bien, sauf pour une chose - quand je supprime un poste d'enregistrement, je m'attends à de RoR pour supprimer tous liés à des enregistrements de commentaires. Je comprends que ActiveRecords est indépendante de base de données, donc il n'y a aucun moyen intégré pour créer la clé étrangère, les relations, SUR SUPPRIMER, SUR la mise à JOUR des déclarations. Donc, est-il un moyen pour accomplir cette (peut-être RoR lui-même pourrait prendre soin de suppression de commentaires? )?
Vous devez vous connecter pour publier un commentaire.
Oui. Sur les Rails de modèle d'association, vous pouvez spécifier le
:dependent
option, qui peut prendre l'une des trois formes suivantes::destroy/:destroy_all
Les objets associés sont détruits à côté de cet objet en les appelant par leursdestroy
méthode:delete/:delete_all
Tous les objets associés sont immédiatement détruites sans l'appel de leur:destroy
méthode:nullify
Tous les objets associés à' les clés étrangères sont définies àNULL
sans appel de leursave
rappelsNoter que le
:dependent
option est ignorée si vous avez un:has_many X, :through => Y
association.Donc, pour votre exemple, vous pouvez choisir d'avoir un post à supprimer tous les commentaires associés lorsque le poste est supprimé, sans remettre chaque commentaire est
destroy
méthode. Qui ressemblerait à ceci:Mise à jour pour les Rails 4:
Dans les Rails 4, vous devez utiliser
:destroy
au lieu de:destroy_all
.Si vous utilisez
:destroy_all
, vous aurez l'exception::destroy
au lieu de:destroy_all
De rails journaux:The :dependent option must be one of [:destroy, :delete_all, :nullify, :restrict_with_error, :restrict_with_exception]