我正在尝试在我的rails模型上执行group_by操作,但似乎有一些问题。我有一个名为student的模型
class CreateStudents < ActiveRecord::Migration
def change
create_table :students do |t|
t.integer :student_id
t.string :department
t.integer :maths
t.integer :physics
t.integer :chemistry
t.string :year
t.timestamps null: false
end
end
end
运行时在rails控制台上
s = Student.all.group("date(created_at)")
我有以下错误:
ActiveRecord::StatementInvalid: PG::GroupingError: ERROR: column "students.id" must appear in the GROUP BY clause or be used in an aggregate function
LINE 1: SELECT "students".* FROM "students" GROUP BY date(created_at...
^
: SELECT "students".* FROM "students" GROUP BY date(created_at)
然而,当我跑
时 s = Student.all.group("date(created_at)").count
它成功运行。
我是铁杆新手。
Rails 4.2.6 Ruby 2.3.1
答案 0 :(得分:0)
您期望group
没有count
的结果是什么?
想象一下你有一张桌子:
id | created_at
——————|———————————
1 | 2016-06-12
2 | 2016-06-12
3 | 2016-06-12
4 | 2016-06-13
5 | 2016-06-13
现在使用count
,结果将是:
count | created_at
——————|———————————
3 | 2016-06-12
2 | 2016-06-13
但是没有count
就会发生碰撞(第一列值未确定。)
这个问题与Rails无关,它是一个典型的SQL问题,没有格式良好的聚合。请分享,您实际想要实现的目标(通过此操作获得。)
是否要将结果分组到Ruby端,获取数组并使用Ruby Enumerable#group_by
将其分组到数组实例上(请注意,这是相当低效强>):
Model.all.group_by &:created_at
答案 1 :(得分:0)
使用此代码:
s = Student.group(:created_at)
如果您想使用group
代替group_by
,请不要使用all
,因为它会返回对象数组。
使用group_by
:
s = Student.all.group_by(&:created_at)