不要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