Rails 4左外连接具有Group By和count的多个表

时间:2014-08-26 13:14:02

标签: ruby-on-rails ruby activerecord ruby-on-rails-4

是否可以在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

1 个答案:

答案 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').

它们应该作为返回对象的属性可用,就像普通的数据库字段一样。