2012-04-12 6 views
0

Ich habe Benutzer, die viele Punkte und Punkte zu Benutzern gehören.Wie füge ich meinem Benutzermodell basierend auf einer anderen Tabelle eine Zählergesamtmenge hinzu?

Punkte können beliebig sein.

Ich möchte Art meiner db sein, indem eine Gesamtpunktzahl Cache zu meinem Benutzermodell hinzugefügt, damit ich einfach nur user.total_points tun können

wie kann ich über die Umsetzung dieses gehen?

EDIT: PS Ich füge Punkte zum ersten Mal, so gibt es keine Notwendigkeit, zurück und berechnen Punkte zu gehen, die Benutzer haben bereits verdient ... nur muss es vorwärts gehen

+0

Wurde noch nicht verwendet, aber es gibt eine Technik namens "Counter_cache" mit Schienen eingebaut. Aber kann nicht mehr als dieses Schlüsselwort und eine Verbindung zur Verfügung stellen: http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html (nach "counter_cache" suchen) – Deradon

Antwort

1

können Sie verwenden, um die counter_cache Technik, wenn Zeile in der points Tabelle bildet einen Punkt. Andernfalls können Sie es mit einem einfachen after_save Filter implementieren.

class User 
    # add a column called total_points and set the default to 0  
    has_many :points  
end 


class Point 

    # assuming `amount` column stores the points.  
    belongs_to :user 

    after_create { |p| p.update_user_points(:create) } 
    after_update { |p| p.update_user_points(:update) if p.amount_changed? } 
    after_destroy{ |p| p.update_user_points(:destroy)} 

    def update_user_points(type) 
    delta = (type == :create) ? amount : 
       (type == :update) ? (amount - amount_was) : 
       -amount 
    User.update_counters(user, :total_points => delta) 
    end 

end 
+0

Meine Antwort aktualisiert, um das Zerstörungsszenario auch mit einzuschließen. –

+0

Warum müssen Sie after_create, after_update und after_destroy einen Block füttern? –

+0

Ich bin irgendwie verwirrt über das, was Sie hier tun. Woher weiß der Code, was Menge und Menge sind? muss ich diese einstellen? –

Verwandte Themen