私の人生のために、コールバックが実行されない理由を見つけようとしています(ほとんどの場合、そのままで動作するので、時々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 レコードは常に作成されていますが、支払いレコードのみが update(
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)