Rails PG GroupingError 列必须出现在 GROUP BY 子句中

Rails PG GroupingError column must appear in the GROUP BY clause

关于这个的一些主题已经有了公认的答案,但我无法根据这些找到解决方案: 例如:

我的查询是:

Idea.unscoped.joins('inner join likes on ideas.id = likes.likeable_id').
select('likes.id, COUNT(*) AS like_count, ideas.id, ideas.title, ideas.intro, likeable_id').
group('likeable_id').
order('like_count DESC')

这在使用 sqlite 进行开发时很好,但在使用 PostgreSQL 的 heroku 上会中断。

错误是:

PG::GroupingError: ERROR:  column "likes.id" must appear in the GROUP BY clause or be used in an aggregate function

如果我将 likes.id 放入我的组中,那么结果将毫无意义。试图将组放在 select 之前,但没有帮助。我什至试图将查询分为两部分。没有快乐。 :(

任何建议表示赞赏。 TIA!

我不知道你为什么要 select likes.id 首先。我看到您基本上想要每个想法的 like_count;我看不出 selecting likes.id 有什么意义。此外,当您已经拥有 ideas.id 时,我不明白您为什么想要获得 likes.likeable_id 的值,因为它们是相等的。 :/

无论如何,问题是因为你按 likeable_id 分组(基本上是 ideas.id),你不能 "select" likes.id 因为它们会是 "lost"按分组。

我想 SQLite 对此很松懈。我想它不会正确地分组。

无论如何(2) =>

让我提出一个更清洁的解决方案。

# model
class Idea < ActiveRecord::Base
  # to save you the effort of specifying the join-conditions
  has_many :likes, foreign_key: :likeable_id
end

# in your code elsewhere
ideas = \
  Idea.
  joins(:likes).
  group("ideas.id").
  select("COUNT(likes.id) AS like_count, ideas.id, ideas.title, ideas.intro").
  order("like_count DESC")

如果你还想获取每个项目的点赞ID,那么在上面之后,你可以这样做:

grouped_like_ids = \
  Like.
  select(:id, :likeable_id).
  each_with_object({}) do |like, hash|
    (hash[like.likeable_id] ||= []) << like.id
  end

ideas.each do |idea|
  # selected previously:
  idea.like_count
  idea.id
  idea.title
  idea.intro

  # from the hash
  like_ids = grouped_like_ids[idea.id] || []
end

其他读者:我对 "clean" 单查询非子查询解决方案非常感兴趣。如果您留下回复,请在评论中告诉我。谢谢。