2016-06-13 6 views
0

私のレールモデルでgroup_by操作を実行しようとしていますが、問題があるようです。私は次のエラー持っrailsアクティブなレコードでグループを操作できません

s = Student.all.group("date(created_at)") 

実行したときに、私は、レールコンソールで

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 

などのモデルという名前の学生を持っている:私は実行しかし

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 ルビー2.3.1

+0

が重複する可能性[リンク](http://stackoverflow.com/questions/18061285/postgresql-must-appear-in-the-group-by-clause-or-be -used-in-aggregate-functi) –

答えて

0

あなたはcountなし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 | created_at 
——————|——————————— 
    3 | 2016-06-12 
    2 | 2016-06-13 

しかしcountずに衝突がある

(最初の列の値は未定であるが。)

問題はRailsとは関係がありません。これは整形式ではない典型的なSQLの問題です。あなたが実際に達成するために何を望むか、共有してください(この操作の結果として受信する。)あなたがグループにRubyの側の結果をするかどうか

を、アレイ上で、RubyのEnumerable#group_byを配列し、グループそれを得ますインスタンス(これはかなり非効率的で、注意してください):

Model.all.group_by &:created_at 
+0

すべてのフィールドを 'created_at'でグループ化します。もし私が間違っていたら、それを達成する方法を教えてください。 同じstudent_idを持つ全学生の平均点を表示したい – aks

+0

「すべてのフィールド」とはどういう意味ですか?私が提供した非常に簡単な入力データを考えれば、望ましい結果は何でしょうか? – mudasobwa

+0

同じstudent_idを持つすべての生徒の平均マークを付けることができますか? – aks

0

このコードを使用します。

s = Student.group(:created_at) 

あなたはを使用したい場合ではgroup_byの代わりにallを使用しないでください。これはオブジェクトの配列を返すためです。 group_byを使用して

s = Student.all.group_by(&:created_at) 
+0

私は私の答えに記載された理由のために前者と同じエラーが発生します。後者はruby/client側の配列です。 – mudasobwa

+0

私は自分の答えを更新しました。 –

関連する問題