Как создать расчет суммы при обновлении после сохранения, перед перенаправлением, после всех действий? - PullRequest
0 голосов
/ 07 июля 2019

У меня есть вложенная форма:

  <%= form_for shop_product do |f| %>
   ...
    <%= f.fields_for :shop_product_print_files do |ff| %>
       <%= ff.object.print_location.title %>
          <%= ff.hidden_field :print_location_id %>
              <%= ff.select :image_file_id, options_for_select(@image_files.map { |image| [image.id, {'data-img-src'=>image.image_file_url(:thumb)}]}), {:include_blank => 'Noneblank'}, class: "image-picker" %>
       ...

Которая при обновлении будет отклонять и удалять, если :image_file_id пусто:

модель shop_product

 accepts_nested_attributes_for :shop_product_print_files, reject_if: :reject_file, :allow_destroy => true

  def reject_file(attributes)
    if attributes[:image_file_id].blank?
      if attributes[:id].present?
        attributes.merge!({:_destroy => 1}) && false
      else
        true
      end
    end
  end

В методе обновления, где проблема:

@shop_product.price = (@shop_product.print_locations.to_a.sum { |sp| sp.price } + @shop_product.product.price)

Удаление происходит ПОСЛЕ обновления и, похоже, является последним действием, которое происходит перед перенаправлением успешного обновления.

Как создать этот расчет после его обновления и уничтожения записей?

Я пытался:

after_commit :calculate_price

  def calculate_price
      self.price = (self.print_locations.to_a.sum { |sp| sp.price } + self.product.price)
    end
  end

after_updated after_save

Не работает

Чтобы уточнить, этот расчет работает на создание.проблема заключается в том, что из-за удаления записей при обновлении, как уже упоминалось, он срабатывает до изменения базы данных, поэтому я подумал, что after_commit будет работать.

Попытка в ShopProductPrintFile модель:

after_commit :calculate_sp, on: [:update, :destroy]

  def calculate_sp
    shop_product = ShopProduct.find(self.shop_product.id)
      price = (shop_product.print_locations.to_a.sum { |sp| sp.price } + shop_product.product)
      shop_product.update_attributes!(price: price)
    end
  end

Все еще не работает, но, похоже, это должно?Мой синтаксис в письме неверен?

РЕШЕНИЕ:

  after_commit :calculate_sp

  def calculate_sp
    shop_product = ShopProduct.find(self.shop_product.id)
      price = (shop_product.print_locations.to_a.sum { |sp| sp.price } + shop_product.product.price)
    shop_product.price =  price
    shop_product.save!
  end

Ответы [ 2 ]

0 голосов
/ 08 июля 2019

Это работает с добавлением моей модели ShopProductPrintFile.

При обновлении, создании и уничтожении.

  after_commit :calculate_sp

  def calculate_sp
    shop_product = ShopProduct.find(self.shop_product.id)
      price = (shop_product.print_locations.to_a.sum { |sp| sp.price } + shop_product.product.price)
    shop_product.price =  price
    shop_product.save!
  end

Я не буду принимать этот ответ, так как уверен, что лучшеспособ или синтаксис для этого.Если у вас есть это, пожалуйста, ответьте с ним и почему это более эффективный или лучший подход, и я приму ваш

0 голосов
/ 07 июля 2019

попробуйте использовать after_commit :update_product_price, on: :destroy в вашей ShopProductPrintFile модели. Он сработает, когда shop_product_print_files уничтожено, и вам нужно пересчитать цену за товар.

И в вашем примере вам нужно добавить save! к вашему after_commit, иначе он не будет сохранен в базе данных. Но вы должны быть осторожны, так как это вызовет другое обновление модели продукта и снова вызовет after_commit. поэтому вы должны добавить условие, чтобы определить, должен ли срабатывать after_commit.

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