2016-06-13 5 views
0

Я пытаюсь выполнить операцию group_by на моей модели рельсов, но, похоже, есть некоторые проблемы. У меня есть модель с именем студент какНевозможно выполнить групповую работу в рельсах активной записи

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 

на рельсы консоли при запуске

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 рубин 2.3.1

+0

Возможные Дублировать [Link] (http://stackoverflow.com/questions/18061285/postgresql-must-appear-in-the-group-by-clause-or-be -used-in-an-aggregate-functi) –

ответ

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 с неадекватной агрегацией. Пожалуйста, поделитесь, что вы на самом деле хотели добиться (получить в результате этой операции.)

Если вы хотите сгруппировать результат на Руби стороне, получить массив и сгруппировать его с Руби Enumerable#group_by, на массиве экземпляр (обратите внимание, что это довольно неэффективно):

Model.all.group_by &:created_at 
+0

Я хочу, чтобы все поля сгруппированы по 'created_at'. Скажите, пожалуйста, как достичь этого, если я ошибаюсь. Я хочу, чтобы средние оценки всех учеников с одним и тем же student_id – aks

+0

Что значит «все поля»? Учитывая очень простые входные данные, которые я представил, каков будет желаемый результат? – mudasobwa

+0

Я хочу, чтобы средние оценки каждого ученика с одним и тем же учеником, я могу это сделать? – aks

0

использовать этот код:

s = Student.group(:created_at) 

Если вы хотите использовать group вместо group_by, то не используйте all, потому что он возвращает массив объектов.

с помощью group_by:

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

Первое производит ту же ошибку из-за причин, которые я описал в своем ответе, последний - _grouping_ массив на стороне ruby ​​/ client. – mudasobwa

+0

Я обновил свой ответ. –