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

时间:2015-02-19 10:44:02

标签: postgresql ruby-on-rails-4 heroku heroku-postgres

有一些关于此的主题已经接受了答案,但我找不到基于这些的解决方案: 例如:

我的查询是:

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放在我的小组中,那么结果就没有意义了。尝试在选择之前放置组但没有帮助。我甚至试图将查询分为两部分。没有快乐。 :(

任何建议表示赞赏。 TIA!

1 个答案:

答案 0 :(得分:2)

我不知道你为什么要首先选择likes.id。我看到你基本上想要每个Idea的like_count;我没有看到选择likes.id的重点。此外,当您已经拥有ideas.id时,我不明白为什么您希望获得likes.likeable_id的价值,因为它们都是平等的。 :/

无论如何,问题是因为您按likeable_id(基本上是ideas.id)进行分组,您无法选择" likes.id因为他们会失去"通过分组。

我认为SQLite对此很松懈。我想它不会把事情分组。

ANYWAY(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

其他读者:我对&#34;清洁&#34;非常感兴趣。一查询非子查询解决方案。如果您留下回复,请在评论中告诉我。感谢。