背景:我有帖子和用户,并且都有很多社区。 p>
目标:对于任何给定的用户,我想返回一组帖子,按帖子与用户共有的社区数量排序(共享更多社区的帖子更高向上)
我当前的尝试(使用排序方法)有效:
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 }
但有更好/更有效的方法吗?
答案 0 :(得分:6)
我对更好/更高效的理解是你想要在数据库中执行排序,而不是Ruby。
这是一个(更简单的?)查询,只返回与用户共同拥有社区的帖子。
current_user.posts.joins(:communities).merge(current_user.communities)
merge
过滤了joins
,我最喜欢的一个(对我而言)ActiveRecord tricks。
好的,那么我如何应用类似的方法来按照共同的社区数量进行排序,而不仅仅是过滤? 在这里,这样做:
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
为每个communities_posts创建单独的帖子结果,然后我们使用group
和COUNT
在数据库中通过用户和帖子之间的不同匹配社区对这些结果进行分组。
值得注意的是,由于select
,返回的每条记录看起来都像帖子,但也会回复post.community_count
。