Como posso excluir uma entrada de uma HABTM unir a tabela em trilhos?
Pergunta
Através de muitas iterações de testes, eu só notei que a minha unir a tabela que representa uma relação HABTM entre dois modelos não está removendo entradas quando instâncias destes modelos são apagados. Preciso fazer algo especial ao remover uma instância de um modelo que tem relações HABTM?
Solução
Ao estreitar relacionamentos HABTM inspeção deve ser remover juntar entradas da tabela. No entanto nem relacionamentos HABTM ou a relação que eu descrevi na versão original (ver história pós) desta solução irá remover aqueles juntar entradas da tabela quando você elimina o registro com o método delete
. ActiveRecord::Base#delete
não provoca quaisquer chamadas de retorno, tais como os de um relacionamento HABTM estabelece para remover entradas órfãs da tabela de junção. Em vez disso você deve estar usando ActiveRecord::Base#destroy
.
Você terá que usar SQL puro para remover as entradas desnecessárias. Se você decidir criar um modelo de participar, você pode interagir através de entradas no modelo de participar, excluindo aqueles sem uma associação.
Exemplo:
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? }
Outras dicas
As entradas na tabela de junção deve ser ficando excluído sem ter que fazer nada de especial. Você pode adicionar a opção :delete_sql
ao seu código para alterar o comportamento, se você tem uma situação estranha. Excluindo o objeto do outro lado da junção não é um comportamento padrão.