Не может работать before_validation, когда вложенное поле удалено с помощью кокона - PullRequest
0 голосов
/ 14 сентября 2018

У меня есть эта миграция и модель для 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

Когда я сохраняю запись после добавления или редактирования вложенного поля, она работает хорошо.Но если я отредактирую вложенное поле, чтобы вычислить, вложенное поле не будет работать

1 Ответ

0 голосов
/ 18 сентября 2018

Существует опция :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 
...