无法在rails活动记录中执行组操作

时间:2016-06-13 05:00:48

标签: ruby-on-rails ruby ruby-on-rails-4.2

我正在尝试在我的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

2 个答案:

答案 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)