2

Ich habe zwei Modelle:Rails Assoziation Rückruf mit zwischengespeicherten Abfrage

class Basket < ActiveRecord::Base 
    has_many :products 

    def recalculate_price! 
    price = products.map(&:price).sum 
    save 
    end 
end 

class Product < ActiveRecord::Base 
    belongs_to :basket 

    after_save :update_basket 

    def update_basket 
    basket.recalculate_price! 
    end 
end 

und als ich es so nennen:

basket = Basket.new 
basket.products.build(price) 
basket.save 

Das Problem: basket.price nicht aktualisieren.

Ich habe das Problem untersucht und herausgefunden, dass es eine Art Caching in update_basket Methode gibt. Das Problem konnte mit reload vor basket.recalculate_price! gelöst werden.

Gibt es eine Option, die update_basket Methode unberührt zu lassen? Ich habe viele solcher Fälle in meiner Bewerbung.

Ich würde gerne verstehen, wie es funktioniert und ähnliche Probleme in der Zukunft vermeiden.

Hinweis: Ich habe kürzlich Schienen von 3.2 auf 4.2 aktualisiert. In einer früheren Version hat alles gut funktioniert.

Antwort

1

Gibt es eine Option, die update_basket-Methode unberührt zu lassen?

Absolut. Sie können auf Ihrer after_create eine Bedingung stellen zu vermeiden es einige Male ausführen:

after_save :update_basket if: :basked_should_be_updated 

[...] 

private 

def basked_should_be_updated 
    [...] 
    # return true or false in here 
end 
+0

Sie haben das Hauptproblem nicht angesprochen: warum 'basket.price' nicht aktualisiert und wie man es beheben – d3m0n

Verwandte Themen