2012-12-17 84 views
0

我在本地使用arel創建了我自己的搜索。Postgresql Arel和Group By

def self.search(search) 
    User.joins(:experience).where(Experience.arel_table[:description].matches("%#{search}%") 
      .or(Experience.arel_table[:description].matches("%#{search.capitalize}%")) 
      .or(Experience.arel_table[:job_title].matches("%#{search}%")) 
      .or(Experience.arel_table[:job_title].matches("%#{search.capitalize}%"))) 
      .group(:user_id) 
end 

一切都很好,直到推向heroku。

Heroku的日誌告訴我下面的消息:

ActionView::Template::Error (PGError: ERROR: column "users.id" must appear in the GROUP BY clause or be used in an aggregate function 

這是選擇:

SELECT "users".* FROM "users" INNER JOIN "experiences" ON "experiences"."user_id" = "users"."id" WHERE (((("experiences"."description" ILIKE '%rails%' OR "experiences"."description" ILIKE '%Rails%') OR "experiences"."job_title" ILIKE '%rails%') OR "experiences"."job_title" ILIKE '%Rails%')) GROUP BY user_id ORDER BY created_at DESC LIMIT 7 OFFSET 0): 

正如你所看到的,我有。集團(:USER_ID)在我的方法,所以我不承認這個錯誤

在此先感謝您的幫助。

UPDATE

我改變這樣的方法之後:

User.joins(:experience).where(Experience.arel_table[:description].matches("%#{search}%") 
.or(Experience.arel_table[:description].matches("%#{search.capitalize}%")) 
.or(Experience.arel_table[:job_title].matches("%#{search}%")) 
.or(Experience.arel_table[:job_title].matches("%#{search.capitalize}%"))) 
.select("experiences.user_id, users.email") 
.group("experiences.user_id, users.email") 

我在這一行

<%= user.information.name %> 

如果我得到這個錯誤在我看來

undefined method `name' for nil:NilClass 

抹掉這一行I g et此錯誤

Routing Error 

No route matches {:action=>"show", :controller=>"users", :id=>#<User email: "jgiro[email protected]">} 

回答

1

您需要做一個select

User.joins(:experience).where(Experience.arel_table[:description].matches("%#{search}%") 
     .or(Experience.arel_table[:description].matches("%#{search.capitalize}%")) 
     .or(Experience.arel_table[:job_title].matches("%#{search}%")) 
     .or(Experience.arel_table[:job_title].matches("%#{search.capitalize}%"))) 
     .select("experiences.user_id, users.email") 
     .group("experiences.user_id, users.email") 

如果您沒有指定要選擇的列,Rails將默認嘗試選擇所有列。

更新

當進行SQL查詢,在SELECT顯示所有字段必須在GROUP BY露面。所以如果你有SELECT foo, bar, baz, MAX(id) FROM foo_bars GROUP BY foo, bar, baz,那麼foo,barbaz必須在GROUP BY。由於MAX(id)是一個聚合函數,因此它不必出現在GROUP BY中。

但是,如果您不想嘗試這種GROUP BY,那麼Rails有一個名爲group_by的應用程序方法。你這樣使用它:

@experiences.group_by {|x| x.user_id} 

這將返回一個哈希與密鑰作爲用戶ID和價值作爲經驗。

+0

它不起作用,現在它說失蹤的屬性:電子郵件 – Jean

+0

什麼是行不通的?您需要選擇所需的所有字段,就像普通的SQL查詢一樣。 '.select(「user_id,email」).group(:user_id,:email)' –

+0

這是錯誤SQLite3 :: SQLException:不明確的列名:created_at:SELECT user_id,email FROM「users」INNER JOIN「experience」ON 「體驗」。「user_id」=「users」。「id」WHERE((((「experience」。「description」LIKE'%perra%'or「experience」。description「LIKE'%Perra%')or」體驗「。」job_title「LIKE'%perra%')或」體驗「。「job_title」LIKE'%Perra%'))GROUP BY user_id,email ORDER BY created_at DESC LIMIT 7 OFFSET 0 – Jean