Как я могу удалить запись из таблицы соединений HABTM в рельсах?
Вопрос
В ходе многих итераций тестирования я только что заметил, что моя таблица соединений, представляющая отношения HABTM между двумя моделями, не удаляет записи при удалении экземпляров этих моделей.Нужно ли мне делать что-то особенное при удалении экземпляра модели, имеющей отношения HABTM?
Решение
При более внимательном рассмотрении отношений 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
вариант вашего кода, чтобы изменить поведение, если у вас возникла странная ситуация.Удаление объекта на другой стороне соединения не является поведением по умолчанию.