Message
的属性为location
,like_count
,vote_count
。
一个Comment
belongs_to :message
,其属性为like_count
,vote_count
我已经设法找出如何散布location
以及Message
中location
给出的投票数。
@votes_by_place = Message.where(
:user_id => @user.id).select(
:location).group(:location).sum('like_count + vote_count')
# => "Total votes and likes of your Messages posted in New York, United States ": 192
# => "Total votes and likes of your Messages posted in Paris, France ": 93
我可以保持这样,这很好,但如果我能找到一种方法来总结vote_count
和like_count
comments
,我真的很喜欢它} user_id => @user.id
和特定@message.location
这样就会变成:
# => "Total votes and likes of your Messages and Comments posted in New York, United States ": 192
# => "Total votes and likes of your Messages and Comments posted in Paris, France ": 93
如果我将location
分配给Comments
也许会更容易吗?
让我知道您的想法,我们非常感谢任何建议!
答案 0 :(得分:1)
您可以执行此查询。
SELECT location, SUM(comments.vote_count + comments.like_count) as total_vote_and_like FROM messages
JOIN comments ON messages.id = comments.message_id
GROUP BY messages.location
对于ActiveRecord:
@votes_by_place = Message.select("messages.location, SUM(comments.vote_count + comments.like_count) as total_vote_and_like")joins(:comments).where(user_id => @user.id).group("messages.location")
我希望这会对你有所帮助。
您可以转到此链接获取详细信息http://sqlfiddle.com/#!9/65bb32/6。
答案 1 :(得分:1)
我不确定如何在单个查询中执行此操作,但只需要两个查询和一些简单的Ruby就可以完成。也许其他人可以找到更有效的方式。
with_comments = Message.where(user_id: @user.id).
left_outer_joins(:comments).
group(:location).
sum('messages.like_count + messages.vote_count + comments.like_count + comments.vote_count')
此第一个查询会添加like_count
和vote_count
的所有messages
和comments
个messages
和comments
个left_outer_joins
的{{1}}和group
}}。使用without_comments = Message.where(user_id: @user.id).
left_outer_joins(:comments).
where(comments: { message_id: nil }).
group(:location).
sum('messages.like_count + messages.vote_count')
可确保对like_count
的调用为所有邮件位置添加哈希密钥,包括那些没有关联注释的邮件位置,以便表示所有用户的邮件位置。
vote_count
此第二个查询仅添加messages
的{{1}}和messages
表,而comments
表没有关联的totals = with_comments.dup
totals.each_key do |location|
totals[location] += without_comments[location].to_i
end
。
dup
nil
第一个哈希并对其进行迭代,将两个哈希值相加,并将0
值转换为base.Method2()
。