Question

Grâce à de nombreuses itérations de tests, je viens de remarquer que ma table de jointure qui représente une relation HABTM entre deux modèles ne supprime pas les entrées lorsque des instances de ces modèles sont supprimés. Est-ce que je dois faire quelque chose de spécial lors de la suppression d'une instance d'un modèle qui a des relations HABTM?

Était-ce utile?

La solution

Lors des relations HABTM d'inspection plus étroite devrait supprimerons joindre les entrées de table. Cependant ni les relations HABTM ou la relation que je décrit dans la version originale (voir l'histoire post) de cette solution va supprimer les joindre entrées de la table lorsque vous supprimez le dossier avec la méthode delete. ActiveRecord::Base#delete ne déclenche pas de callbacks, comme celles d'une relation HABTM établit pour supprimer les entrées orphelines de la table de jointure. Au lieu de cela, vous devriez utiliser ActiveRecord::Base#destroy.

Vous devrez utiliser SQL brute pour supprimer les entrées inutiles. Si vous décidez de créer une jointure modèle, vous pouvez parcourir les entrées du modèle se joindre, en supprimant ceux sans association.

Exemple:

class Foo < ActiveRecord::Base
  has_many :foo_bars, :dependent => :destroy
  has_many :bars, :through => :foo_bars
end

class FooBar < ActiveRecord::Base
  belongs_to :foo
  belongs_to :bar
end

class Bar < ActiveRecord::Base
  has_many :foo_bars, :dependent => :destroy
  has_many :foos, :through => :foo_bars
end

FooBar.all.each{|fb| fb.destroy? if fb.foo.nil? || fb.bar.nil? }

Autres conseils

Les entrées de la table de jointure doivent être supprimés sans se faire vous quelque chose de spécial. Vous pouvez ajouter l'option :delete_sql à votre code pour modifier le comportement si vous avez une situation bizarre. Suppression de l'objet de l'autre côté de la jointure n'est pas un comportement par défaut.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top