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
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)