Pregunta

A través de muchas iteraciones de las pruebas, que acabo de notar que mi tabla de unión que representa una relación entre dos modelos HABTM no es la eliminación de entradas cuando las instancias de estos modelos se eliminan. ¿Necesito hacer algo especial al quitar una instancia de un modelo que tiene relaciones HABTM?

¿Fue útil?

Solución

Tras una inspección más cercana relaciones HABTM deben unirse quitando entradas de la tabla. Sin embargo, ni las relaciones HABTM o la relación que he descrito en la versión original (ver historia post) de esta solución se eliminarán los unen entradas de la tabla cuando se elimina el registro con el método delete. ActiveRecord::Base#delete no provoca ningún devoluciones de llamada, como los que se establece una relación HABTM para eliminar entradas huérfanas de la tabla de unión. En su lugar debe ser el uso de ActiveRecord::Base#destroy.

Usted tendrá que utilizar SQL prima para quitar las entradas que no sean necesarios. Si decide crear un modelo de unirse, puede iterar a través de entradas en el modelo de unirse, eliminando los que no tienen una asociación.

Ejemplo:

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? }

Otros consejos

Las entradas de la tabla de unión debe ser eliminado sin que hacer nada especial. Se puede añadir la opción :delete_sql a su código para cambiar el comportamiento si usted tiene una situación extraña. Eliminar el objeto en el otro lado de la unión no es un comportamiento predeterminado.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top