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