Ruby on rails Rails 4左侧外部使用Group By和count连接多个表

Ruby on rails Rails 4左侧外部使用Group By和count连接多个表,ruby-on-rails,ruby,activerecord,ruby-on-rails-4,Ruby On Rails,Ruby,Activerecord,Ruby On Rails 4,是否可以使用group by和counts在Rails4中进行左外连接。我正在尝试编写一个作用域,它将用户和消息、评论和喜欢的表进行左外连接,然后按id分组以获得总计数。如果没有关联,则计数应为零 因此,最终的结果集将是cuuser.*、消息计数、喜欢计数和评论计数。你知道如何做到这一点吗?提前谢谢 class Cuuser < ActiveRecord::Base has_and_belongs_to_many :groups has_many :messages

是否可以使用group by和counts在Rails4中进行左外连接。我正在尝试编写一个作用域,它将用户和消息、评论和喜欢的表进行左外连接,然后按id分组以获得总计数。如果没有关联,则计数应为零

因此,最终的结果集将是cuuser.*、消息计数、喜欢计数和评论计数。你知道如何做到这一点吗?提前谢谢

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
class-Cuuser{joins(:comments,:likes)。
选择('cuusers.id')。
组('cuusers.id')。
拥有('count(comments.id)+count(likes.id)>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猜测关联的能力

如果使用Squel gem,可以使用以下格式:

joins{ [comments.outer, likes.outer, messages.outer] }
squel以稍微合理的格式公开了Arel,因此您可以在仍然从模型定义猜测关联的情况下执行诸如左外连接之类的操作

你当然可以用阿雷尔,但事情很快就会变得非常笨拙

要获取您的计数,请尝试:

select('cuusers.id, count(messages.id) as message_count, count(likes.id) as likes_count, count(comments.id) as comments_count').

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

感谢您现在尝试。如果左侧外部联接关联为空,您知道如何将零显示为消息_计数吗。我不认为你需要用计数来做那件事。谢谢。它给出了正确的查询。但是,在输出中,只显示id,而不显示计数。输出和范围都在这里,没关系。这是一次大脑冻结。。模型中的拼写错误。谢谢你的帮助