MySQL / Ruby on Rails - Wie „SUM“ in a: has_many Fall
-
02-10-2019 - |
Frage
Ich habe die folgenden Tabellen:
Benutzer: has_many Käufe
Item: has_many Käufe
Element hat eine Spalte „Menge“ (kann + oder -). Und ich brauche alle Nutzer zu finden, die eine positive Summe von „Item.amounts“ haben (über alle Käufe jeder gemacht hat)
Wie funktioniert diese Abfrage aussehen? (Ich bin nicht sicher, wie „SUM“ richtig zu handhaben, in diesem Fall).
Ich begann mit dem folgenden, aber offensichtlich, dass es falsch ist ... (es wäre nicht „schließen“ Käufe, die ein Element mit einem negativen Item.amount haben ...)
@users = User.find (: alle,
: Include => {: Käufe =>: item},
: Select => "SUM (item.amount)",
: Order => "...",
: Bedingungen => "...",
: Group => "users.id",
: Mit => "SUM (item.amount)> 0" )
Vielen Dank für Ihre Hilfe bei diesem!
Tom
Lösung
Versuchen Sie diese:
User.all(:joins => items, :group => "users.id",
:having => "SUM(items.amount) > 0")
Andere Tipps
Es klingt wie dies ein gutes Beispiel für einige Modellverfahren ist.
Das habe ich nicht testen, aber ich glaube, Sie wollen etwas tun ähnlich der folgenden:
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
dann
User.items_total