【问题标题】:Ordering by number of associations in common even if none (rails)即使没有(rails),也按共同关联的数量排序
【发布时间】:2015-05-25 22:11:39
【问题描述】:

我正在做一个与这个问题非常相似的项目: Ordering by number of associations in common (Rails)

说问的提问者(霓虹灯)写道,

背景:我有帖子和用户,并且都有很多社区。​​p>

目标:对于任何给定的用户,我想返回一个帖子集合,按帖子与 用户(具有更多共同社区的帖子更高)

很遗憾,该解决方案仅包含具有至少一个共同社区的帖子。我的 quandry 需要包括按公共社区数量排序的所有帖子。

扩展目标:结果必须是一个 AREL 对象,其中所有个帖子按公共社区的数量排序,包括与用户有零个社区的帖子(帖子更高的共同社区更多)。

【问题讨论】:

    标签: mysql sql ruby-on-rails activerecord arel


    【解决方案1】:

    如果您需要包含与用户共有的零社区的帖子,您可以使用LEFT JOIN。要清理join 条件中发送的参数,我们可以在类方法中定义它,以便sanitize_sql_array 方法可用:

    # Post class
    def self.community_counts(current_user)
      current_user.posts.joins(sanitize_sql_array(["LEFT JOIN community_posts ON community_posts.post_id = posts.id AND community_posts.community_id IN (?)", current_user.community_ids])).select("posts.*, COUNT(DISTINCT community_posts.community_id) AS community_count").group("posts.id").order("community_count DESC")
    end
    

    其他信息

    INNER JOIN 返回两个表之间的交集。 LEFT JOIN 从左表返回所有行(在本例中为 posts)并从右表(community_posts)返回匹配的行,但当没有匹配时,它也会在右侧返回 NULL(没有与用户社区匹配的社区的帖子)。请参阅this answer 获取插图。

    据我所知,Rails 没有提供任何帮助方法来生成LEFT JOIN。我们必须为这些写出 SQL。

    LEFT JOINLEFT OUTER JOIN (more info) 相同。

    【讨论】:

    • 哇,太好了 - 在我将您的答案标记为正确之前,我需要先试用您的解决方案,但您能否解释一下 LEFT JOINJOIN 有何不同?你是否碰巧知道是否有任何 Rails 说服方法来执行“LEFT JOIN”?
    • 另外,LEFT JOINLEFT OUTER JOIN 不同吗?
    • 看起来你的答案很好。谢谢您的帮助!如果你有办法,如果你能扩展你的答案来回答我的最后两个 cmet,那就太好了。
    • 添加了其他信息来回答。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-19
    • 2012-05-25
    • 1970-01-01
    相关资源
    最近更新 更多