2011-01-04 11 views
4

Ich habe eine Rails App, die in der Entwicklung (SQLite) funktioniert, aber viele Fehler wirft, wenn ich es über Heroku, die PostgreSQL verwenden ich sammle.Heroku PostgreSQL GROUP_BY Fehler in Rails App

die Fehlermeldung zurückgegeben bekommen:

 ActionView::Template::Error (PGError: ERROR: 
column "practices.id" must appear in the GROUP BY clause or be used in an aggregate function: 
SELECT "practices".* 
FROM "practices" WHERE ("practices".activity_id = 1) 
AND ("practices"."created_at" BETWEEN '2011-01-01' AND '2011-01-31') 
GROUP BY DATE(created_at) ORDER BY created_at DESC): 

dies geworfen wird, wenn ich die folgenden nennen:

def month_days_not_practiced(date = Date.today) 
    p = practices.where(:created_at => date.at_beginning_of_month..date.at_end_of_month).group("DATE(created_at)").to_a.count 
    days_in_month(date.year, date.month) - p 
end 

ich wirklich den Code sauber halten möchten, so dass es auf beiden Entwicklungsarbeiten und Produktions-DBs ... kann jemand etwas Licht abwerfen?

Ich habe dies versucht:

def month_days_not_practiced(date = Date.today) 
    p = practices.where(:created_at => date.at_beginning_of_month..date.at_end_of_month).group("practices.id, DATE(created_at)").to_a.count 
    days_in_month(date.year, date.month) - p 
end 

ohne Erfolg ...

tia.

Antwort

4

Sie müssen von all die Spalten in der Auswahlliste zu einer Gruppe, so

.group("practices.id, practices.foo, practices.bar, ..., DATE(created_at)") 

Ihre Idee Gruppe nur durch id ist Ton (unter der Annahme id der Primärschlüssel ist), aber PostgreSQL Unterstützung nur für das in Version 9.1.

+0

ah Prost! Das tut es. –

+0

Ich bin dadurch gründlich verwirrt worden. Wenn ich nach allen Spalten, die ich auswähle, gruppieren muss, dann scheint es, dass ich von keinem von ihnen gruppiert werde? Mit y löst unsere Antwort den Fehler, aber jetzt bin ich im Wesentlichen mit '.all'. Ich bin mir sicher, dass ich hier etwas verpasse, aber es hat mich bisher angedeutet. – wuliwong

5
Practice.group(Practice.col_list) 



def self.col_list 
    Practice.column_names.collect {|c| "practices.#{c}"}.join(",") 
end 
0
Practice.joins(:foobar).group_all 

def self.group_all 
    group(group_all_columns) 
end 

def self.group_all_columns 
    @group_all_columns ||= column_names.collect {|c| "#{table_name}.#{c}"}.join(",") 
end 
Verwandte Themen