是否可以在Rails4中使用group by和count进行左外连接。我正在尝试编写一个范围,它将使用消息,注释和喜欢的表对用户进行左外连接,然后按ID分组以获得总计数。如果没有关联,则计数应为零。
因此最终结果集将是cuuser。*,message_count,likes_count和comments_count。知道如何实现这一目标吗?在此先感谢!
class Cuuser < ActiveRecord::Base
has_and_belongs_to_many :groups
has_many :messages
has_many :comments
has_many :likes
validates :username, format: { without: /\s/ }
scope :superusers, -> { joins(:comments, :likes).
select('cuusers.id').
group('cuusers.id').
having('count(comments.id) + count(likes.id) > 2')}
end
答案 0 :(得分:2)
您可以删除SQL字符串:
joins("LEFT OUTER JOIN comments ON comments.cuuser_id = cuuser.id LEFT OUTER JOIN likes ON likes.cuuser_id = cuuser.id LEFT OUTER JOIN messages on messages.cuuser_id = cuuser.id")
这不是很好。您正在牺牲一些可移植性和ActiveRecord猜测关联的能力。
如果你使用了Squeel gem,你可以使用以下格式:
joins{ [comments.outer, likes.outer, messages.outer] }
Squeel以稍微更合理的格式暴露Arel,因此您可以执行左外连接等操作,同时仍然可以猜测模型定义中的关联。
你当然可以使用Arel,但事情很快变得非常笨重。
要获得您的计数,请尝试:
select('cuusers.id, count(messages.id) as message_count, count(likes.id) as likes_count, count(comments.id) as comments_count').
它们应该作为返回对象的属性可用,就像普通的数据库字段一样。