¿Cómo puedo eliminar una entrada de un HABTM tabla de unión en los carriles?
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?
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.