3

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

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

我当前的尝试(使用 sort 方法)有效:

Post.includes(:community_posts).where(community_posts: { community_id: current_user.community_ids }).sort{ |x,y| (y.community_ids & current_user.community_ids).length <=> (x.community_ids & current_user.community_ids).length }

但是有没有更好/更有效的方法来做到这一点?

4

1 回答 1

6

我对更好/更有效的理解是你想在数据库中执行排序,而不是 Ruby。

这是一个(更简单的?)查询,只返回与用户有共同社区的帖子。

current_user.posts.joins(:communities).merge(current_user.communities)

merge过滤器是我最喜欢的joins(对我而言)ActiveRecord 新技巧之一。

好的,那么我如何将类似的方法应用于按共同社区数量排序,而不仅仅是过滤?在这里,这会做:

current_user.posts.joins(:communities).where(communities: {id: current_user.community_ids}).select('posts.*, COUNT(distinct communities.id) AS community_count').group('posts.id').order('community_count DESC')

为每个joins社区帖子创建一个单独的帖子结果,然后我们使用groupCOUNT在数据库中通过用户和帖子之间的不同匹配社区对这些结果进行分组。

值得注意的是,由于 ,select返回的每条记录看起来都像 Post 但也会响应post.community_count

于 2013-07-03T17:54:06.077 回答