Rails Callbacks werden nicht ausgeführt

Ich versuche mein Leben lang herauszufinden, warum meine Rückrufe nicht ausgeführt werdensometimes(Du hast es richtig gehörtmanchmal wie die meiste Zeit funktioniert es aus der Box)

Ich habe nur Eltern-Kind-Beziehungen zwischen zwei Modellen

Nach der Erstellung des Kinderdatensatzes mache ich alles inafter_create Rückruf ist Aktualisierung (akkumulieren Sie den gesamten untergeordneten Betrag im übergeordneten Feld, um starke Abfragen zur Laufzeit zu vermeiden) des Betragsfelds in der übergeordneten Tabelle / im Modelldatensatz

Elternmodell (Payout)

Kindermodell ist (Sales Transaction)

Payout hat viele SalesTransactions Wie oben erwähnt, aktualisiere ich bei der Erstellung der Verkaufstransaktion (und zwar inkrementiert) dieamount Feld des übergeordneten Datensatzes (Auszahlungsdatensatz), um starke Abfragen zur Laufzeit zu vermeiden.

also Auszahlungamount field ist nichts anderes als die Summe aller Beträge dersales_transactions davon Auszahlungen

es ist so gut wie "payout.amount" (nachdem der Rückruf ausgeführt wurde)

payout.amount == payout.sales_transactions.pluck('amount').sum

und das versuche ich mit callbacks zu erreichen

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

Der interessante Teil hier ist dassometime wenn SalesTransaction istcreated Der Rückruf wird nur nicht aufgerufen, da der Aktualisierungswert des Auszahlungsdatensatzes nicht angezeigt wird

Ich versuche, den Rückruf vorerst zu vermeiden, aber um es zu wissenwhy der callback wird nicht ausgeführt hatled me diese Frage stellen

HINWEIS

Es gibt weder eine Validierung für SalesTransaction noch eine Auszahlungstabelle (ich habe dies 1000 Mal überprüft).Payout.validators => []

SalesTransaction.validators => []

Es gibt kein Problem mit der Zuweisung von Massen, wie ich es nicht definiert habeattr_accessible oderattr_protected (Ich überprüfe dies auch und wie gesagt, es funktioniert die meiste Zeit, was bei einer Massenzuweisungswarnung nicht der Fall gewesen wäre.)

SalesTransaction-Datensatz wird die ganze Zeit erstellt, nur der Auszahlungsdatensatz wird nicht aktualisiert (sometime)

Ich habe die meisten unerwünschten (hier) Assoziationen von entferntsales_transactions undpayouts für die Code-Kürze

Nein, so etwas gibt es nichtaccepts_nested_attributes_for bei beiden Modellen

Keine dynamischen Validierungen beigefügt, extra, extra

Zuletzt hier, wie ich versuche, das zu schaffenSalesTransaction

  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)

Antworten auf die Frage(1)

Ihre Antwort auf die Frage