У меня есть вложенная форма:
<%= 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