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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top