如何在分组时汇总父母和子女记录?

时间:2017-08-09 03:02:37

标签: ruby-on-rails ruby-on-rails-5

Message的属性为locationlike_countvote_count

一个Comment belongs_to :message,其属性为like_countvote_count

我已经设法找出如何散布location以及Messagelocation给出的投票数。

@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_countlike_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也许会更容易吗?

让我知道您的想法,我们非常感谢任何建议!

2 个答案:

答案 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_countvote_count的所有messagescommentsmessagescommentsleft_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()