【问题标题】:Ordering by number of associations in common (Rails)按共同关联的数量排序(Rails)
【发布时间】:2013-06-19 19:22:30
【问题描述】:

背景:我有帖子和用户,并且都有很多社区。​​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 }

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

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 sorting activerecord ruby-on-rails-4


    【解决方案1】:

    我对更好/更有效的理解是您希望在数据库中执行排序,而不是 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 为每个社区帖子创建一个单独的帖子结果,然后我们使用groupCOUNT 在数据库中通过用户和帖子之间的不同匹配社区对这些结果进行分组。

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

    【讨论】:

    • 这正是我要找的,只有一次调用数据库。谢谢!我想查询所有帖子(不仅仅是 current_user.posts),所以我的最终查询以:“Post.joins(:communities)...”开头。
    • 我真正希望看到的一个扩展是一个查询,它仍然包括列表末尾公共社区数量为零的帖子。
    • 我已经发布了一个请求,要求我回答我在上一条评论中提到的扩展名:stackoverflow.com/questions/30446662/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-19
    • 2012-05-25
    • 1970-01-01
    • 2016-04-29
    相关资源
    最近更新 更多