2010-05-10 5 views

Répondre

18

Oui, il ne le supporte pas. See the docs. Généralement habtm est destiné uniquement pour les cas très très simples et si vous commencez à avoir besoin de choses plus complexes, vous devriez passer à has_many :through.

73

Si vous voulez garder au simple association has_and_belongs_to_many, vous pouvez ajouter ceci:

class Person < ActiveRecord::Base 
    has_and_belongs_to_many :posts 
    before_destroy { posts.clear } 
end 

qui effacera la table de jointure de toutes les entrées de cette person. Note: Cela ne supprime que les enregistrements de la table de jointure, il ne détruit pas le posts (ce qui est logique si c'est un has_and_belongs_to_many bidirectionnel car le post peut être référencé par d'autres persons).

Mais deviner de vos noms (Person et Post) Je suppose que vous pouvez probablement vous en sortir avec un Person has_many :posts et un Post belongs_to :person auquel cas vous pouvez utiliser le :dependent => :destroy sur l'association has_many.

+1

Pouvez-vous ajouter comment vous pourriez implémenter une action 'dependent:: destroy' sur une relation ** bidirectionnelle **' has_and_belongs_to_many' qui est liée au ** même modèle **? – JJD

+4

Je ne suis pas sûr si la syntaxe était à l'origine comme cette réponse, mais je sais dans les rails 4, il est supposé être 'before_destroy {posts.clear}' – mkralla11

+1

Merci, édité à être 'before_destroy' –

1

Essayez ceci:

class Person < ActiveRecord::Base 
    has_and_belongs_to_many :posts 
    before_destroy do 
    posts.each { |post| post.destroy } 
    end 
end 

Vous ne devez posts.clear que Rails 4.2+ gère déjà.