Ruby on rails rails回调没有得到执行
在我的一生中,我一直在努力找出为什么我的回调有时不会执行(你听对了,有时会执行,因为大多数时候都是开箱即用) 我所拥有的只是两个模型之间的父/子关系 创建子记录后,我在创建后的Ruby on rails rails回调没有得到执行,ruby-on-rails,activerecord,ruby-on-rails-3.2,rails-activerecord,Ruby On Rails,Activerecord,Ruby On Rails 3.2,Rails Activerecord,在我的一生中,我一直在努力找出为什么我的回调有时不会执行(你听对了,有时会执行,因为大多数时候都是开箱即用) 我所拥有的只是两个模型之间的父/子关系 创建子记录后,我在创建后的中所做的一切都是更新父表/模型记录中的金额字段(累积父字段中的所有子金额,以避免在运行时进行繁重的查询) 父模型(支出) 子模型为(销售交易记录) 支出有许多销售交易如上所述,在创建销售交易时,我正在更新(精确地说是递增)父记录(支出记录)的金额字段,以避免在运行时进行繁重的查询 所以支出金额字段只不过是该支出的销售交易的
中所做的一切都是更新父表/模型记录中的金额字段(累积父字段中的所有子金额,以避免在运行时进行繁重的查询)
父模型(支出
)
子模型为(销售交易记录
)
支出
有许多销售交易
如上所述,在创建销售交易时,我正在更新(精确地说是递增)父记录(支出记录)的金额
字段,以避免在运行时进行繁重的查询
所以支出金额字段
只不过是该支出的销售交易
的所有金额的总和
这和payout.amount一样好(在执行回调后)
payout.amount==payout.sales\u交易。pull('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
SalesTransaction.create(options)
我想对Viren发表评论。尝试SalesTransaction.create代码>(带感叹号)。然后,您是否一致地看到批量分配错误?请在保存后而不是创建后重试。我首先想到的是Payout类不是从ActiveRecord::Base继承的。另外,我对注2感到困惑。您是否在application.rb文件中禁用了白名单属性,这就是您不使用attr_accessible的原因?否则,需要定义该属性列表。假设这两个问题不是罪魁祸首,这应该可以工作,因为我刚刚测试过它。@Keith我很抱歉纠正了打字错误it@Keith关于我提到的白名单,我没有在支付模型中定义任何attr_accessible
或attr_protected
,同样在同一点#2
中提到,如果是大规模分配,它会失败始终
而不是有时
不,销售交易记录正在创建,只有付款列更新
不起作用有时
我也检查了付款模型中的批量分配
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}