首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Postgresql Arel和Group By

Postgresql Arel和Group By
EN

Stack Overflow用户
提问于 2012-12-17 23:14:26
回答 1查看 3K关注 0票数 0

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

代码语言:javascript
复制
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日志显示了以下消息:

代码语言:javascript
复制
ActionView::Template::Error (PGError: ERROR:  column "users.id" must appear in the GROUP BY clause or be used in an aggregate function

这是选择:

代码语言:javascript
复制
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),所以我不理解这个错误

提前谢谢你的帮助。

更新

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

代码语言:javascript
复制
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")

在我看来,这个错误

代码语言:javascript
复制
undefined method `name' for nil:NilClass 

在这一行

代码语言:javascript
复制
<%= user.information.name %>

如果我删除这一行,我就会得到这个错误。

代码语言:javascript
复制
Routing Error

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

回答 1

Stack Overflow用户

发布于 2012-12-17 23:16:48

你需要做一个select

代码语言:javascript
复制
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,那么foobarbaz必须在GROUP BY中。因为MAX(id)是一个聚合函数,所以它不必出现在GROUP BY中。

但是,如果您不尝试执行这种GROUP BY,那么Rails就有一个名为group_by的应用程序端方法。你就这样用它:

代码语言:javascript
复制
@experiences.group_by {|x| x.user_id} 

它将返回一个以键作为用户id,值作为体验的散列。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13923843

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档