Ruby on rails Postgresql Arel和分组依据
我在本地使用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.
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,但我收到了相同的错误,但现在在本专栏中出现了与什么相同的错误?不明确的列错误?这是不可能的。