Вопрос

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top