MySQL / Ruby on Rails - Comment « SUM » dans: has_many cas
-
02-10-2019 - |
Question
Je les tableaux suivants:
Utilisateur: has_many Achats
Article: Achats has_many
article a une colonne « montant » (peut être + ou -). Et je dois trouver tous les utilisateurs qui ont une somme positive de « Item.amounts » (sur tous les achats chacun a fait)
Comment ce regard de requête comme? (Je ne sais pas comment gérer « SUM » correctement, dans ce cas.)
J'ai commencé avec ce qui suit, mais évidemment, il ne va pas ... (il ne serait pas « inclure » Les achats qui ont un élément avec un négatif Item.amount ...)
= @users User.find (: tous,
: Include => {: achats =>: item},
: Select => "SUM (item.amount)",
: Order => "...",
: Conditions => "...",
: Groupe => "users.id",
: Avoir => "SUM (item.amount)> 0" )
Merci pour votre aide avec ceci!
Tom
La solution
Essayez ceci:
User.all(:joins => items, :group => "users.id",
:having => "SUM(items.amount) > 0")
Autres conseils
On dirait que c'est un bon cas pour certaines méthodes de modèle.
Je n'ai pas testé, mais je pense que vous voulez faire quelque chose de semblable à ce qui suit:
class User < ActiveRecord::Base
has_many :purchases
has_many :items, :through => :purchases
def items_total
#get all the items iterate over them to get the amount,
#compact to get rid of nils
#and reduce with a sum function to total and return
items.all.each{|item| item.amount}.compact.reduce(:+)
end
puis
User.items_total