Pertanyaan relasi validasi kustom setelah mengedit nilai bidang


pada dasarnya saya memiliki model pengguna yang memiliki jumlah dan bidang uang. Ketika saya pertama kali membuat pengguna, saya memvalidasi itu user.amount <= user.money. Namun, pengguna diizinkan untuk mengubah jumlah melalui 'edit'. Dalam tindakan pembaruan, ketika pengguna mengubah jumlah, saya menghitung selisih antara lama dan baru (lama minus baru) jumlah melalui

  amount_change = user.amount - params[:user][:amount].to_f

Saya tidak tahu apakah ini adalah bentuk yang baik tetapi bekerja untuk saya. Pada dasarnya saya tidak menyimpan perbedaan dan menghitungnya hanya ketika pengguna mencoba untuk mengubah jumlahnya. Pokoknya ketika pengguna mengedit, saya ingin memvalidasi itu amount_change <= user.money sebagai gantinya. Bagaimana saya bisa melakukan ini? Saya merasa seperti saya harus melewati sesuatu untuk validasi, tetapi saya tidak tahu bagaimana saya bisa melewatinya amount_change karena dihitung di tengah-tengah metode pembaruan pengontrol pengguna saya. Terima kasih banyak!


5
2017-12-23 01:12


asal


Jawaban:


Kamu dapat memakai ActiveModel :: Kotor untuk mengakses nilai lama (as amount_was):

class User < ActiveRecord::Base
  # ...
  validate :ensure_amount_change_less_than_money, 
           :on => :update, 
           :if => :amount_changed?

  def ensure_amount_change_less_than_money
    if (self.amount - self.amount_was) <= self.money
      errors.add(:money, 'Amount change must be less than money')
    end
  end
end

11
2017-12-23 01:24