在我的生活中,我试图找出为什么我的回调没有被执行sometimes
(你有时听对了,因为大多数时候它开箱即用)
我所拥有的只是 2 个模型之间的父/子关系
在创建子记录后,我在after_create
回调中所做的就是更新(累积父字段中的所有子金额以避免在运行时进行大量查询)父表/模型记录中的金额字段
父模型( Payout
)
子模型是 ( Sales Transaction
)
Payout
has_many SalesTransactions
如上所述,在创建销售交易时,我正在更新(准确地说是递增)amount
父记录(支付记录)的字段,以避免在运行时进行大量查询。
所以支付amount field
只不过是所有支付金额的 sales_transactions
总和
就像 payout.amount 一样好(回调执行后)
payout.amount == payout.sales_transactions.pluck('amount').sum
这就是我试图使用回调实现的目标
class SalesTransaction < ActiveRecord::Base
belongs_to :payout
after_create :update_payout_for_sale
def update_payout_for_sale
sales_amount = payout.amount || 0
sales_amount = sales_amount + amount.to_f
## Also make note of the minus from original amount i.e refund and custom_deduction_amount
payout.update_attributes(:amount => sales_amount)
end
end
class Payout < ActiveRecord::Base
has_many :sales_transactions
has_one :referrer
after_save :update_referrer_earning
def update_referrer_earning
referrer.update_attributes(:amount => (amount*10)/100.to_d)) rescue nil
end
end
这里有趣的部分是,sometime
当 SalesTransaction 是created
回调时,不会调用回调,因为我没有看到支付记录的更新值
我现在试图避免回调,但为了知道why
回调没有被执行,led me
必须问这个问题
笔记
SalesTransaction 和 Payout 表上也没有验证(我已经检查了 1000 次)
Payout.validators
=> []SalesTransaction.validators
=> []没有质量分配问题,因为我没有定义
attr_accessible
或attr_protected
(我也检查了这个,并且说它在大多数情况下都有效,而质量分配警告不会出现这种情况)SalesTransaction 记录一直在创建,只有付款记录没有更新(
sometime
)为了代码简洁
sales_transactions
,我已经删除了大部分不需要的(在这里)关联payouts
accepts_nested_attributes_for
不,这两种型号都 没有类似的东西没有附加动态验证,额外的,额外的
最后在这里我如何尝试创建SalesTransaction
options = {"performer_id"=>177, "customer_id"=>35526, "sale_type"=>"sale", "show_id"=>502, "performer_percentage"=>BigDecimal.new("40.0"), "show_duration"=>4104, "gross_credits"=>3754, "gross_sales"=>BigDecimal.new("375.4"), "amount"=>BigDecimal.new("150.16"), "affiliate_id"=>nil, "affiliate_earning"=>BigDecimal.new("0.0"), "total_profit"=>BigDecimal.new("225.24"), "payout_period_id"=>89,"payout_id"=>4156, "stream_connection_id"=>540572, "history_id"=>44575, "credits"=>{:when_show_started=>350, :purchased_during_show=>{:free=>[], :paid=>[]}, :total_consumed=>{:free=>350, :paid=>3754}}, "sliding_scale_recalculations_done"=>false, "paid_minutes"=>62.57}
SalesTransaction.create(options)