Обратные вызовы ActiveRecord для ассоциаций, которые заменены новой коллекцией - PullRequest
0 голосов
/ 23 ноября 2010

Обратные вызовы для объектов, которые обновляются при удалении из коллекции отношений, по-видимому, не выполняются для меня.

У меня есть модель EntityLocation, которая служит полиморфным отношением между сущностями (Пользователи / Места / Вещи) и Locations (Zips, Адреса, Соседства).

class EntityLocation < ActiveRecord::Base
  belongs_to :entity, :polymorphic => true
  belongs_to :location, :polymorphic => true

  def after_save
    if entity_id.nil? || location_id.nil?
      # Delete me since I'm no longer associated to an entity or a location
      destroy
    end
  end
end

Для этого примера, давайте предположим, что у меня есть «Вещь» с коллекцией «Locations», на которую ссылается my_thing.locations.Это возвращает коллекцию Zip, Address и т. Д.

Если я напишу код

my_thing.locations = [my_thing.locations.create(:location => Zip.find(3455))]

, то, как ожидается, будет создан новый объект EntityLocation, на который можно будет точно ссылаться из my_thing.locations.Однако проблема в том, что записи, которые ранее содержались в этой коллекции, теперь теряются в базе данных с атрибутом nil entity_id.Я пытаюсь удалить эти объекты в обратном вызове after_save, однако он никогда не выполняется на старом объекте.

Я также пытался использовать after_update и after_remove, и ни один из них не вызывается для старой записи.Вновь созданная запись обратного вызова after_save действительно вызывается, как и ожидалось, но это не помогает мне.

Обновляет ли Rails ранее указанный объект без выполнения цепочки обратного вызова через активную запись?Все идеи приветствуются.Спасибо.

1 Ответ

0 голосов
/ 23 ноября 2010

Почему это должно быть полиморфным? Кажется, что вы могли бы просто использовать has_many :through для моделирования отношения многие ко многим.

Во-вторых, почему бы просто не удалить строку таблицы соединений через связь с :dependent => :destroy? Тогда вам не нужен пользовательский обратный вызов

class Entity < ActiveRecord::Base
  has_many :entity_locations, :dependent => :destroy
  has_many :locations, :through => :entity_locations
end

class EntityLocation < ActiveRecord::Base
  belongs_to :entity
  belongs_to :location
end

class Location < ActiveRecord::Base
  has_many :entity_locations, :dependent => :destroy
  has_many :entities, :through => :entity_locations
end

Теперь удаление с любой стороны также удаляет строку соединительной таблицы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...