ActiveRecord изменился?флаг не сообщает об изменениях в ассоциированных дочерних элементах - PullRequest
2 голосов
/ 27 сентября 2010

У меня следующая ситуация с ActiveRecord (в Rails 2.3.8):

class Order < ActiveRecord::Base
  has_many :documents
  accepts_nested_attributes_for :documents
end

class Document <ActiveRecord::Base
  belongs_to :order
end

Теперь в контроллере я хочу по-разному направлять пользователя в зависимости от того, внесли ли они изменения в существующие записи, например,

@order.attributes = params[:order]
if @order.changed?
  # save order
  # redirect one place
else
  # redirect another place
end

Для чего я хочу использовать измененное? флаг. Получается, что @ order.changed? не запрашивает детей.

Я пытался реализовать это с помощью метода прокси-сервера ассоциации в has_many: Documents Association, например:

  has_many :documents do
    def changed?
      any? {|doc| doc.changed?}
    end
  end

Но у этого есть непреднамеренный побочный эффект, что он загружает связанные документы с диска, который, по-видимому, стирает любые изменения, которые были сделаны в назначении вложенных атрибутов в @ order.attributes = params [: order] Это либо кажется преднамеренным дизайнерское решение в Rails, но тогда как его решить? Или это пробел в особенностях?

Мысли

Wolf

1 Ответ

4 голосов
/ 28 сентября 2010

вы можете взглянуть на источник nested_records_changed_for_autosave .

Это не совсем то, что вы хотите, но есть подсказки о том, как это сделать. Особенно association_instance_get , который «Получает указанный экземпляр ассоциации, если он отвечает: загружен?

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