通过共同的关联数排序,即使没有(轨道)
我正在研究一个与此问题有着非常相似的窘境的项目: 按共同关联数量排序(Rails)
问的提问者(霓虹灯)写道,
背景:我有post和用户,都有很多社区。
目标:对于任何给定的用户,我想返回一组post,按照post与用户共有的社区数量排序(更多社区的post更高)
不幸的是,该解决方案仅包括至少有一个共同社区的post。 我的quandry需要包括按共同社区数量排序的所有post。
扩展目标:结果必须是AREL对象, 所有post按公共社区的数量排序,包括与用户共同拥有零社区的post(共同拥有更多社区的post更高)。
如果您需要包含与用户共同的零社区的post,则可以使用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
(没有与之匹配的社区的post)用户社区)。 请参阅此答案以获取说明。
据我所知,Rails没有提供任何辅助方法来生成LEFT JOIN
。 我们必须为这些写出SQL。
LEFT JOIN
与LEFT OUTER JOIN
相同( 更多信息 )。