【问题标题】:Rails 4 Left outer join multiple tables with Group By and countRails 4左外连接多个表与Group By和count
【发布时间】:2014-08-26 13:14:01
【问题描述】:

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

所以最终结果集将是 cuuser.*、message_count、likes_count 和 cmets_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

【问题讨论】:

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


    【解决方案1】:

    您可以使用 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').
    

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

    【讨论】:

    • 谢谢 现在试试这个。知道如何在左外连接关联为空的情况下将零显示为 message_count
    • 已更新。我认为您不需要对计数进行此操作。
    • 谢谢stackoverflow.com/users/1448966/a-fader-darkly。它给出了正确的查询。但是在输出中,只有 id 出现,而​​不是 counts 。输出和范围在这里gist.github.com/ganeshran/d02cf5b3a0e5cd81978d
    • 没关系。这是一个大脑冻结..模型中的拼写错误。感谢您的帮助
    猜你喜欢
    • 2015-02-28
    • 1970-01-01
    • 1970-01-01
    • 2011-02-07
    • 2019-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多