Ruby on Rails - вычисление before_save для acceptpts_nested_attributes_for - PullRequest
7 голосов
/ 28 февраля 2011

У меня есть модель счета-фактуры, которая "имеет много" элементов счета.У меня есть форма, которая позволяет вам создавать / редактировать счет-фактуру, и эта форма принимает вложенные атрибуты для элементов счета-фактуры.

В моей модели счета-фактуры есть поле «total_amount», которое является вычисляемым полемсумма «сумма» из позиций счета).

Я хочу рассчитать эту сумму при создании или обновлении счета.Я пытаюсь сделать это в событии before_save моей модели счета.Приведенный ниже код почти работает, однако общее количество сохраненных всегда на шаг позади.То есть, если у меня есть счет на общую сумму 20 долларов, и я редактирую этот счет и изменяю элементы счета на общую сумму 15 долларов, а затем сохраняю свой счет, общая сумма не изменяется.Если я открою тот же счет-фактуру и затем сохраню его снова, итоговая сумма будет обновлена ​​правильно.

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

class Invoice < ActiveRecord::Base
  has_many :invoice_items, :dependent => :destroy

  accepts_nested_attributes_for :invoice_items, :allow_destroy => true 

  before_save :record_total_amount

  private
    def record_total_amount
      self.total_amount = self.invoice_items.sum('amount')
    end
end

Любая помощь будет высоко ценится.

Ответы [ 3 ]

5 голосов
/ 28 февраля 2011

Я решил эту проблему, мне пришлось заменить строку расчета на эту:

self.total_amount = invoice_items.map(&:amount).sum
4 голосов
/ 17 марта 2013

Попробуйте это:

self.total_amount = invoice_items.reject(&:marked_for_destruction?).map(&:amount).sum

0 голосов
/ 13 мая 2014

Я знаю, что немного поздно, но, возможно, кто-то может извлечь выгоду. Проверьте журналы, чтобы увидеть порядок операций с БД. У меня была похожая проблема, когда вставка вложенных моделей выполнялась после операции сохранения родительской модели, что приводило к аналогичным результатам.

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