4

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

ここで興味深いのは、 sometimeSalesTransaction がcreatedコールバックである場合、支払いレコードの更新値が表示されないため、コールバックが呼び出されないことです。

今のところコールバックを回避しようとしていwhyますが、コールバックが実行されていないことを知るために、led meこの質問をする必要があります

ノート

  1. SalesTransaction と Payout テーブルのどちらにも検証はありません (これを 1000 回チェックしました) Payout.validators=> []

    SalesTransaction.validators=> []

  2. 私が定義していattr_accessibleないか、または大量割り当ての問題はありませんattr_protected(これもチェックします。また、ほとんどの場合、大量割り当て警告の場合には当てはまらないと言われています)

  3. SalesTransaction レコードは常に作成されていますが、支払いレコードのみが update( sometime)を取得していません

  4. コードを簡潔にするためsales_transactionsに、不要な(ここにある)関連付けのほとんどを削除しましたpayouts

  5. いいえaccepts_nested_attributes_for、どちらのモデルにも 似たようなものはありません

  6. 動的検証は添付されていません、追加、追加

最後に、ここで私が作成しようとしている方法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)

4

2 に答える 2

0

Viren への返信としてコメントを残したいと思います。試してくださいSalesTransaction.create!(感嘆符付き)。その後、大量割り当てエラーが一貫して表示されますか?

于 2013-08-02T21:46:56.880 に答える