Rails: doit apparaître dans la clause GROUP BY ou être utilisé dans une fonction d'agrégation
Je suis en train de suivre le Bate tut sur les graphes & graphiques, mais je reçois un message d'erreur.
C'est l'erreur que je reçois
PG::Error: ERROR: column "orders.created_at" must appear in the GROUP BY clause or be used in an aggregate function
LINE 1: SELECT created_at, sum(amount) as total_amount FROM "orders"...
^
: SELECT created_at, sum(amount) as total_amount FROM "orders" WHERE ("orders"."created_at" BETW
Et c'est le code que j'utilise dans mes Commandes modèle
def self.total_grouped_by_day(start)
orders = where(created_at: start.beginning_of_day..Time.zone.now)#.all
orders = orders.group("date(created_at)")
orders = orders.select("date(created_at), sum(amount) as total_amount")
orders.group_by { |order| order.created_at.to_date }
end
et dans mon helper
def orders_chart_data
orders_by_day = Order.total_grouped_by_day(3.weeks.ago)
(3.weeks.ago.to_date..Date.today).map do |date|
{
created_at: date,
price: orders_by_day[date].first.try(:total_amount) || 0
}
end
end
J'utilise Postgres (qui j'en suis sûr, est la principale raison pour laquelle je reçois cette erreur) & Rails 3.x.x.
Pourquoi est-ce que cette erreur se produise & comment puis-je résoudre ce problème?
Je vous remercie à l'avance
Dans ma console:
Order.where(created_at: 3.weeks.ago.beginning_of_day..Time.zone.now).group("date(created_at)").select("date(created_at), sum(amount) as total_amount")
& c'est ce que je reçois
[#<Order >, #<Order >, #<Order >]
bizarre..
l'exécution de ce dans ma console: Order.where(created_at: 3.weeks.ago.beginning_of_day..Time.zone.now).group("date(created_at)").select("date(created_at), sum(amount) as total_amount").first.total_amount
me donne ceci:
Creating scope :page. Overwriting existing method Order.page.
Order Load (18.1ms) SELECT date(created_at), sum(amount) as total_amount FROM "orders" WHERE ("orders"."created_at" BETWEEN '2013-07-05 00:00:00.000000' AND '2013-07-26 23:50:38.876609') GROUP BY date(created_at) LIMIT 1
=> "10.0"
OriginalL'auteur goo | 2013-07-26
Vous devez vous connecter pour publier un commentaire.
Vous êtes regroupement sur
date(created_at)
mais pas la sélection de la colonne. Modifier cette ligne::
Qui aura aussi pour conséquence un changement de la ligne suivante group_by.
De l'un de mes projets, en utilisant un peu d'attributs différents, mais faire la même chose que vous:
missing attribute: created_at
Obtenir cette erreur dans la prochaine group_by ligne? Vous aurez. Vous avez besoin de regarder ce que vous obtenez de retour avant de le faire group_by comme il n'est probablement pas ce que vous voulez plus. N'oubliez pas, vous modifié les sélectionner afin que la colonne n'est pas retourné plus.
Bon, alors je doit le changer pour
orders.group_by { |order| order.date(created_at).to_date }
droit? Je ne suis pas sûr, parce que après avoir fait cela, je reçoisundefined local variable or method
created_at' #<Classe...`Pas de. Vous devriez regarder pour voir ce qui est retourné avant de vous appeler. Ma mémoire est vous aurez une table de hachage. Les clés de la chaîne de valeur de la "date(created_at)" et les valeurs seront les arguments restants. Mais je pourrais être tout à fait tort à ce sujet. Vérifier la documentation et de l'essayer dans la console.
veuillez voir ma question. J'ai édité dans ce que je suis arriver dans ma console.. Ce que je fais mal?
OriginalL'auteur Philip Hallstrom
Un plâtre à la date serait la plus simple & plus rapide. Voici le SQL brut depuis que je ne suis pas un expert avec la syntaxe Ruby (et pas un fan de l'Orm boucherie SQL en général).
OriginalL'auteur Erwin Brandstetter