Не может работать before_validation, когда вложенное поле удалено с помощью кокона
У меня есть эта миграция и модель для order и order_detail с жемчужиной кокона.
class CreateOrders < ActiveRecord::Migration[5.0]
def change
create_table :orders do |t|
t.integer :total_price
t.timestamps
end
end
end
class CreateOrderDetails < ActiveRecord::Migration[5.0]
def change
create_table :order_details do |t|
t.integer :subtotal_price
t.integer :unit_price
t.integer :quantity
t.references :order, foreign_key: true
t.timestamps
end
end
end
class Order < ApplicationRecord
has_many :order_details, inverse_of: :order, dependent: :destroy
before_validation :calculate_order_price
accepts_nested_attributes_for :order_details, :reject_if => :all_blank, :allow_destroy => true
def calculate_order_price
order_details.each(&:calculate_order_detail_price)
self.total_price = order_details.map(&:subtotal_price).sum
end
end
class OrderDetail < ApplicationRecord
belongs_to :order
def calculate_order_detail_price
self.subtotal_price = unit_price * quantity
end
end
Когда я сохраняю запись после добавления или редактирования вложенного поля, это работает хорошо. Но если я отредактирую вложенное поле для удаления, метод calc_order_price не будет работать.
Если кто-то знает об этом, пожалуйста, сообщите мне.
1 ответ
Решение
Есть вариант :touch
который удостоверится, что при обновлении родитель устанавливает updated_at
(или другие поля), но он не будет запускать проверки. Однако есть и вариант :validate
(но не совсем уверен, что он будет вызван уничтожением):
belongs_to :order, validate: true
В противном случае, если те не работают, вы могли бы сделать что-то вроде
class OrderDetail < ApplicationRecord
belongs_to :order
after_destroy :trigger_parent_validation
def trigger_parent_validation
if order.present?
order.validate
end
end
end