2010-12-05 11 views
8

Ich habe zwei Rails-Modelle, ein Kind und ein Elternteil sagen.Zugehörige Modelle und SUM-Abfrage in Rails

Ich weiß, dass ich das tun kann:

Child.sum(:income, :conditions => "parent_id = #{@parent_id}") 

Aber ich möchte in der Lage sein, dies zu tun:

Parent.children.sum(:income) 

Aber das ist mir die falschen Werte zu geben, wenn ich es versuchen. Gibt es eine prägnantere Schreibweise?

Child.sum(:income, :conditions => "parent_id = #{@parent_id}") 

?

TIA

[ps: Rails 3 dev Umgebung]

Antwort

13

Sorry, aber ich habe gerade die Antwort auf diese herausgefunden. Ich brauchte to_a auf die Sammlung von Child-Objekte hinzuzufügen, und eine proc zu nennen, wie so:

Parent.children.to_a.sum(&:income) 

Dieser einen Zauber wirkt.

3

Entschuldigung, dass ich einen alten Thread angestoßen habe, aber ich denke, dass ich eine bessere (beste?) Lösung gefunden habe. Im Folgenden finden Sie Code für mein Projekt, das ich

landete
self.purchases.where(:script_id => script_id, :approved => true).sum(:instances) 

Es erzeugt eine Abfrage, die genau das tut, was ich brauche

SELECT SUM("purchases"."instances") AS sum_id FROM "purchases" WHERE "purchases"."customer_id" = 1 AND "purchases"."script_id" = 1 AND "purchases"."approved" = 't' 
+0

Ich muss sagen, ich mag diese Vorstellung davon, dass in dem Modell ein wenig besser –

3

ich in ein Problem lief, wo das Kind zum Vater wurde zu delegieren und ich brauchte um eine Summe zu finden.

children.to_a.sum(:parent_income) 

gab mir ein großes N + 1 Problem. Die Lösung wurde zu verwenden:

children.joins(:parent).sum(:income) 
0

ich auch in einer ähnlichen Situation lief, war hier die Lösung in Schienen 4 mit auch überprüft, ob Gegenstände waren aktiv oder inaktiv ausgezählt werden. Ich habe das im Modell vor dem Speichern ausgeführt.

order_items.collect { |oi| oi.valid? ? (oi.quantity * oi.price) : 0 }.sum 
Verwandte Themen