52 votes

Suppression en cascade dans les modèles Ruby ActiveRecord?

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

Les Relations entre les modèles fonctionnent 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? )?

95voto

John Topley Points 58789

Oui. Sur les Rails de modèle d'association, vous pouvez spécifier l' :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 leurs destroy 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 à l' NULL sans appel de leur save rappels

Notez que l' :dependent option est ignorée si vous avez un :has_many X, :through => Y association a mis en place.

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 de l' destroy méthode. Qui ressemblerait à ceci:

class Post < ActiveRecord::Base
  validates_presence_of :body, :title
  has_many :comments, :dependent => :delete_all
end

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X