Ruby on rails Postgresql Arel和分组依据

Ruby on rails Postgresql Arel和分组依据,ruby-on-rails,ruby-on-rails-3,heroku,ruby-on-rails-3.2,Ruby On Rails,Ruby On Rails 3,Heroku,Ruby On Rails 3.2,我在本地使用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创建了自己的搜索

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):
如您所见,我的方法中有.group:user_id,因此我不理解这个错误

Routing Error

No route matches {:action=>"show", :controller=>"users", :id=>#<User email: "jgiron@hotmail.com">}
提前感谢你的帮助

更新

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

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")
@experiences.group_by {|x| x.user_id} 
在我看来,这是一个错误

undefined method `name' for nil:NilClass 
在这一行

<%= user.information.name %>
如果我删除这一行,我会得到这个错误

Routing Error

No route matches {:action=>"show", :controller=>"users", :id=>#<User email: "jgiron@hotmail.com">}
你需要做一个选择

如果未指定要选择的列,Rails将在默认情况下尝试选择所有列

更新

执行SQL查询时,SELECT中显示的所有字段都必须显示在GROUP BY中。因此,如果您已按foo、bar、baz从foo_bars分组中选择foo、bar、baz、MAXid,则foo、bar和baz必须位于分组中。因为MAXid是一个聚合函数,所以它不必出现在groupby中

但是,如果您不尝试执行这种分组方式,那么Rails有一个名为groupby的应用程序端方法。您可以这样使用它:

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")
@experiences.group_by {|x| x.user_id} 

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

什么不起作用?您需要选择所需的所有字段,就像普通SQL查询一样。selectuser\u id,email.group:user\u id,:email这是错误SQLite3::SQLException:不明确的列名:created\u at:SELECT user\u id,来自用户的电子邮件内部加入experiences.user\u id=users.id,其中experiences.description(如“%perra%”或experiences.description(如“%perra%”)或experiences.job\u title(如“%perra%”)按用户id分组,电子邮件订单(如在描述限制7偏移量0处创建),您必须这样做。选择Experiences.user\u id,users.email.groupexperiences.user\u id,users.email谢谢Sean,但我收到了相同的错误,但现在在本专栏中出现了与什么相同的错误?不明确的列错误?这是不可能的。