保存,重定向之前,所有操作之后,如何在更新时创建总和计算?

时间:2019-07-07 08:32:28

标签: ruby-on-rails ruby

我有一个嵌套的表单:

  <%= 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

不起作用

同样要澄清的是,此计算适用于create。问题是由于如上所述删除了更新记录,它在更改数据库之前启动,这就是为什么我认为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 :(得分:0)

尝试在您的after_commit :update_product_price, on: :destroy模型中使用ShopProductPrintFile。当shop_product_print_files被销毁时,您需要重新计算产品价格。

在您的示例中,您需要将save!添加到after_commit中,否则它将不会保存到数据库中。但是您应该小心,它将触发对产品模型的另一次更新并再次触发after_commit。因此您必须添加条件以检测是否应触发after_commit

答案 1 :(得分:0)

这可以与放入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

我不会接受此响应,因为我确信这样做有更好的方法或语法。如果您有此问题,请回答并说明为什么它是一种更有效或更有效的方法,我会接受您的