Работа с несохраненными ассоциациями - PullRequest
2 голосов
/ 09 марта 2010

Допустим, у меня есть две модели:

class Model1 < ActiveRecord::Base
  has_many :model2

  def save
    self.attr = <sth. complex involving the associated model2 instances>
    super
  end
end

class Model2 < ActiveRecord::Base
  belongs_to :model1
end

Оператор в перезаписанном методе save выдаст сложный запрос (используя find [или альтернативно названные области действия]) для вычисления некоторого совокупного значениядля некоторых связанных экземпляров Model2.Проблема заключается в том, что когда новый экземпляр Model1 вместе с некоторыми экземплярами Model2, этот запрос не будет ничего возвращать в первый save после создания объектов и будет возвращать старые данные (предыдущее поколение) для всех последовательных операций save.

Есть ли способ использовать find для непостоянного состояния в памяти?

1 Ответ

6 голосов
/ 10 марта 2010

Конечно: это называется #select, или #inject, или любой другой метод -ect:

class Model1 < ActiveRecord::Base
  has_many :model2

  before_save :update_aggregate_value

  private
  def update_aggregate_value
    # returns sum of unit_value for all active model2 instances
    self.attr = model2.select(&:active?).map(&:unit_value).sum
  end
end

class Model2 < ActiveRecord::Base
  belongs_to :model1
end

Помните, что в этом случае БД будет не обработана, за исключением случаев, когда экземпляры model2 еще не были загружены. Также обратите внимание, что я использовал обратный вызов before_save вместо переопределения #save. Это «безопаснее», так как вы можете вернуть false и предотвратить сохранение.

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