Rails:必须出现在GROUP BY子句中或用于聚合函数

goo*_*goo 7 postgresql ruby-on-rails

我正在跟随贝特对图表和图表的啧啧,但我得到了一个错误.

这是我得到的错误

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
Run Code Online (Sandbox Code Playgroud)

这是我在Orders模型中使用的代码

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
Run Code Online (Sandbox Code Playgroud)

在我的帮手

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
Run Code Online (Sandbox Code Playgroud)

我正在使用Postgres(我很确定这是我收到此错误的主要原因)&Rails 3.xx为什么会出现此错误以及如何解决?

先感谢您


在我的控制台中:

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")
Run Code Online (Sandbox Code Playgroud)

这就是我得到的

[#<Order >, #<Order >, #<Order >] 
Run Code Online (Sandbox Code Playgroud)

奇怪的..


在我的控制台中运行: 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"
Run Code Online (Sandbox Code Playgroud)

Phi*_*rom 6

您正在分组date(created_at)但未选择该列.改变这一行:

orders = orders.select("created_at, sum(amount) as total_amount")
Run Code Online (Sandbox Code Playgroud)

对此:

orders = orders.select("date(created_at), sum(amount) as total_amount")
Run Code Online (Sandbox Code Playgroud)

这也将导致改变下一行的group_by.

从我的一个项目中,使用稍微不同的属性,但做同样的事情:

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"}
Run Code Online (Sandbox Code Playgroud)