Rails 3: условная сумма before_save - PullRequest
0 голосов
/ 16 января 2012

Я потратил довольно много времени на поиски ТАК, но я застрял ...

Я хотел бы вычислить base_price для product до того, как product будет сохранено в базе данных, но я бы хотел сделать условную сумму для поля required в таблице вариантов.

Вот соответствующий код:

class Product < ActiveRecord::Base
  has_and_belongs_to_many :variants

  before_save :calculate_price

  private

  def :calculate_price
    self.base_price = variants.where( :required => true ).to_a.sum( &:price_fixed )
  end
end

:required - логическое поле в variants

Оператор работает для уже сохраненного продукта, но не для того, который еще не был создан. Поэтому, когда я создаю продукт, цена равна $ 0, при обновлении base_price рассчитывается правильно.

Может ли кто-нибудь помочь, пожалуйста?

Ответы [ 2 ]

0 голосов
/ 16 января 2012

Так что проблема в том, что когда вы делаете [self.]variants.where(...) в Product, вы неявно делаете запрос, подобный SELECT * FROM variants WHERE id = #{product.id} AND ..., но, поскольку продукт не был сохранен, у него еще нет id.

Однако, если вы присвоили Варианты новому Продукту в контроллере (и, следовательно, у него есть элементы в его коллекции self.variants), и у этих Вариантов правильно установлены атрибуты :required, вы можете просто отфильтровать его с помощью Enumerable#select как и любой другой массив, например:

def :calculate_price
  self.base_price = variants.to_a.select( &:required ).sum &:price_fixed
end
0 голосов
/ 16 января 2012

Я всегда смешиваю себя с различными типами обратных вызовов. Обычно, когда я хочу вычислить атрибут из других атрибутов, я иду с before_validation. before_save кажется более адаптированным, но я так и не смог заставить его работать так, как я хотел.

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