Comment puis-je supprimer une entrée d'une jointure HABTM table rails?
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?
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.