0

我使用 arel 在本地创建了这个方法来创建我自己的搜索。

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 Logs 向我显示以下消息:

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):

如您所见,我的方法中有 .group(:user_id) ,所以我不理解这个错误

在此先感谢您的帮助。

更新

在我改变这样的方法之后:

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")

我认为这个错误

undefined method `name' for nil:NilClass 

在这一行

<%= user.information.name %>

如果我删除此行,我会收到此错误

Routing Error

No route matches {:action=>"show", :controller=>"users", :id=>#<User email: "jgiron@hotmail.com">}
4

1 回答 1

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,那么foobar而且baz必须在GROUP BY。由于MAX(id)是一个聚合函数,它不必出现在GROUP BY.

然而,如果你不想做这种GROUP BY,那么 Rails 有一个应用程序端的方法叫做group_by. 你像这样使用它:

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

它将返回一个散列,其中键作为用户 ID,值作为体验。

于 2012-12-17T23:16:48.287 回答