2013-07-26 43 views
7

グラフ&のBateさんのTutに従っていますが、エラーが発生しています。 Rails:GROUP BY句に表示するか、集計関数で使用する必要があります

この

は私が

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 

を取得していますエラーで、これは私が私の注文モデル

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 

で、私のヘルパーで使用しているコードです

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 

私はPostgresを使用しています(私はかなり確信しています私はこのエラーが出ている主な理由)& Rails 3.x.x. このエラーはなぜ発生しますか&どうすれば修正できますか?

は、事前に私のコンソールで


ありがとう:

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") 

&これは私が変な

[#<Order >, #<Order >, #<Order >] 

得るものです。..


私のコンソールでこれを実行している

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

は私にこれを与える:

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" 

答えて

6

あなたはdate(created_at)にグループ化するが、その列を選択されていません。これに

orders = orders.select("created_at, sum(amount) as total_amount") 

orders = orders.select("date(created_at), sum(amount) as total_amount") 

も同様に次の行のGROUP_BYに変更になります。この行を変更します。私のプロジェクトの1から

、わずかに異なる属性を使用して、あなたと同じことをやって:これまでの

1.9.3p327 > User.group('date(created_at)').select('date(created_at), sum(id) as total_amount').first.attributes 
    User Load (1.2ms) SELECT date(created_at), sum(id) as total_amount FROM "users" GROUP BY date(created_at) LIMIT 1 
=> {"date"=>"2011-09-27", "total_amount"=>"657"} 
+0

私は実際には最初にこれを試してみましたが、このエラー '属性行方不明になっています:次のGROUP_BYラインでそのエラーを取得created_at' – goo

+0

を?あなたはするであろう。おそらくあなたが望むものではないので、あなたはあなたがそのgroup_byを行う前にあなたが戻ってきたものを見なければなりません。列がもう返されないように、選択を微調整したことを忘れないでください。 –

+0

そうですね、それを 'orders.group_by {| order | order.date(created_at).to_date} '正しい?私はそれをした後、 ' goo

1

キャストが&最速最も簡単でしょう。ここでは、私はRubyの構文(そして一般的にORMのファンを持たないファン)の専門家ではないので、未加工のSQLを使用しています。

SELECT created_at::date, sum(amount) AS total_amount 
FROM orders 
WHERE created_at ... 
GROUP BY created_at::date 
ORDER BY created_at::date 
関連する問題