Как я могу удалить запись из таблицы соединений HABTM в рельсах?
После многих итераций тестирования я просто заметил, что моя таблица соединений, которая представляет отношения HABTM между двумя моделями, не удаляет записи, когда экземпляры этих моделей удаляются. Нужно ли делать что-то особенное при удалении экземпляра модели, имеющей отношения HABTM?
2 ответа
При ближайшем рассмотрении отношения HABTM должны удалять записи таблицы соединений. Однако ни отношения HABTM, ни отношения, которые я описал в исходной версии (см. Историю публикаций) этого решения, не удаляют эти записи таблицы присоединения, когда вы удаляете запись с помощью delete
метод. ActiveRecord::Base#delete
не вызывает никаких обратных вызовов, таких как те, которые устанавливает отношение HABTM, чтобы удалить потерянные записи из таблицы соединения. Вместо этого вы должны использовать ActiveRecord::Base#destroy
,
Вам придется использовать необработанный SQL для удаления ненужных записей. Если вы решите создать модель соединения, вы можете перебирать записи в модели соединения, удаляя их без связи.
Пример:
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? }
Записи в объединительной таблице должны быть удалены без каких-либо специальных действий. Вы можете добавить :delete_sql
вариант вашего кода, чтобы изменить поведение, если у вас странная ситуация. Удаление объекта на другой стороне соединения не является поведением по умолчанию.