2010-12-05 12 views
8

J'ai deux modèles Rails, un enfant et un parent.Modèles associés et requête SUM dans Rails

Je sais que je peux le faire:

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

Mais je veux être en mesure de le faire:

Parent.children.sum(:income) 

Mais cela me donne de mauvaises valeurs si je l'essayer. Existe-t-il une façon plus concise d'écrire?

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

?

TIA

[ps: Rails 3 environnement dev]

Répondre

13

Désolé, mais je viens de trouver la réponse à cette question. Je avais besoin d'ajouter to_a à la collection d'objets d'enfants, et appeler un proc, comme si:

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

Cela fonctionne un charme.

3

Désolé de trouver un vieux fil, mais je pense que j'ai trouvé la meilleure (meilleure?) Solution. Ci-dessous le code pour mon projet que j'ai fini

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

Il produit une requête qui fait exactement ce que je dois

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

Je dois dire que j'aime cette idée de ce qui se passe dans le modèle un peu mieux –

3

je suis tombé sur un problème où l'enfant déléguait au parent et je avais besoin trouver une somme

children.to_a.sum(:parent_income) 

me donner un grand N + 1 problème. La solution a consisté à utiliser:

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

J'ai aussi couru dans une situation similaire, ici était la solution dans des rails 4 avec vérifier également si les éléments étant comptés étaient actifs ou inactifs. J'ai couru cela dans le modèle avant de sauvegarder.

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