2016-06-13 3 views
0

Ich versuche, Group_by-Operation auf meinem Schienenmodell durchzuführen, aber es scheint ein Problem zu geben. Ich habe ein Modell namens Schüler alsGruppe kann nicht in aktiven Schienensatz ausgeführt werden

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 

auf Schienen Konsole, wenn ich

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

betreibe ich den folgenden Fehler haben:

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) 

Allerdings, wenn ich laufen

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

es läuft erfolgreich.

Ich bin neu in Schienen.

Rails 4.2.6 Rubin 2.3.1

+0

Mögliche Duplizieren [Link] (http://stackoverflow.com/questions/18061285/postgresql-must-appear-in-the-group-by-clause-or-be -used-in-aggregate-functi) –

Antwort

0

Was tun Sie ein Ergebnis von group ohne count zu erwarten?

Stellen Sie eine Tabelle haben:

id | created_at 
——————|——————————— 
    1 | 2016-06-12 
    2 | 2016-06-12 
    3 | 2016-06-12 
    4 | 2016-06-13 
    5 | 2016-06-13 

Jetzt mit count das Ergebnis wäre: (. Erste Spalte Wert ist unbestimmt)

count | created_at 
——————|——————————— 
    3 | 2016-06-12 
    2 | 2016-06-13 

Aber ohne count einer Kollision

Das Problem hat nichts mit Rails zu tun, es ist ein typisches SQL-Problem mit nicht wohlgeformter Aggregation. Bitte teilen, was man eigentlich erreichen wollte (als Ergebnis dieser Operation zu erhalten.)

Ob das Ergebnis auf Ruby-Seite, erhalten Sie das Array und die Gruppe mit Ruby-Enumerable#group_by, auf dem Array gruppieren möchten Beispiel (bitte beachten Sie, das ist eher ineffizient):

Model.all.group_by &:created_at 
+0

Ich möchte alle Felder gruppiert nach 'created_at'. Bitte sagen Sie mir, wie ich das erreichen kann, wenn ich falsch liege. Ich möchte durchschnittliche Noten aller Schüler mit derselben student_id – aks

+0

Was meinst du "alle Felder"? Angesichts der sehr einfachen Eingabedaten, die ich zur Verfügung gestellt habe, was wäre das gewünschte Ergebnis? – mudasobwa

+0

Ich möchte durchschnittliche Noten von jedem Schüler mit derselben student_id, kann ich das tun? – aks

0

Verwendung dieser Code:

s = Student.group(:created_at) 

Wenn Sieverwendenanstelle von group_by dann verwenden Sie nicht all, weil es Array von Objekten zurückgibt.

mit group_by:

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

Die erste erzeugt den gleichen Fehler aus Gründen, die ich in meiner Antwort beschrieben habe, letzteres ist _gruppierung_ das Array auf der Ruby/Client-Seite. – mudasobwa

+0

Ich habe meine Antwort aktualisiert. –

Verwandte Themen