按照共同的关联顺序排序,即使没有(rails)

时间:2015-05-25 22:11:39

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

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

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

  

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

目标:对于任何给定的用户,我想返回一组帖子,按帖子与其共有的社区数量排序   用户(具有更多社区的帖子更高)

不幸的是,该解决方案仅包含至少有一个共同社区的帖子。我的quandry需要包括所有通过共同社区订购的帖子。

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

1 个答案:

答案 0 :(得分: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 JOINmore info)相同。