有一些关于此的主题已经接受了答案,但我找不到基于这些的解决方案: 例如:
我的查询是:
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!
答案 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;非常感兴趣。一查询非子查询解决方案。如果您留下回复,请在评论中告诉我。感谢。