我今天遇到了一些麻烦,无法思考如何解决这个问题。
基本上,我有一个名为Airplane的模型,该模型有很多付款。每次付款都可以分为多期。好的!
这是信息:
Model Airplane
- has_many payments
- before_save :checks_if_everything_has_been_paid
Model Payment
- belongs_to airplane
- has_many installments
Model Installment
- belongs_to payment
所以,我想做的是当分期付款的总和等于或大于飞机票的价值时,Airplane.paid将为true。我这样做是使用before_save“ checks_if_everything_has_been_paid。但这仅在“飞机”字段发生更改时才有效。
当“付款”和“分期付款”字段都发生更改时,如何运行此类?
我想检查每次更改分期付款或付款本身是否完成付款。
谢谢!
代替after save
在Airplane模型上定义after_add
回调,而在payments
关联上定义回调。
class Airplane < ActiveRecord::Base
has_many :payments, after_add: :checks_if_everything_has_been_paid
def checks_if_everything_has_been_paid
# work some magic
end
end
更新:如果我正确理解您的数据模型,我认为以下方法可能是更好的方法。如果保存了付款或分期付款,它将触发飞机检查全额付款:
class Airplane < ActiveRecord::Base
has_many :payments
has_many :installments, through: :payments
def check_for_full_payment
# work some magic
end
end
class Payment < ActiveRecord::Base
belongs_to :airplane
has_many :installments
after_save :trigger_full_payment_check
def trigger_payments_check
airplane.check_for_full_payment
end
end
class Installment < ActiveRecord::Base
belongs_to :payment
delegate :airplane, to: :payment
after_save :trigger_full_payment_check
def trigger_payments_check
airplane.check_for_full_payment
end
end
这种方法的好处是,付款和分期付款中的逻辑是相同的,因此您可以将其提取到模块中:
module TriggerFullPaymentCheck
def self.included(base)
base.after_save :trigger_full_payment_check
end
def trigger_payments_check
airplane.check_for_full_payment
end
end
class Airplane < ActiveRecord::Base
has_many :payments
has_many :installments, through: :payments
def check_for_full_payment
# work some magic
end
end
class Payment < ActiveRecord::Base
include TriggerFullPaymentCheck
belongs_to :airplane
has_many :installments
end
class Installment < ActiveRecord::Base
include TriggerFullPaymentCheck
belongs_to :payment
delegate :airplane, to: :payment
end
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句