Как я могу удалить запись из таблицы соединений HABTM в рельсах? - PullRequest
5 голосов
/ 16 декабря 2009

На протяжении многих итераций тестирования я только заметил, что моя таблица соединений, которая представляет отношения HABTM между двумя моделями, не удаляет записи, когда экземпляры этих моделей удаляются. Нужно ли делать что-то особенное при удалении экземпляра модели, имеющей отношения HABTM?

Ответы [ 2 ]

7 голосов
/ 16 декабря 2009

При ближайшем рассмотрении отношения 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? }
0 голосов
/ 17 декабря 2009

Записи в таблице соединений должны быть удалены без каких-либо специальных действий. Вы можете добавить опцию :delete_sql в свой код, чтобы изменить поведение, если у вас странная ситуация. Удаление объекта с другой стороны объединения не является поведением по умолчанию.

...