3

背景:私には投稿とユーザーがあり、どちらにも多くのコミュニティがあります。

目的:特定のユーザーに対して、投稿のコレクションを返したいと思います。投稿がユーザーと共通しているコミュニティの数によって並べ替えられています (共通のコミュニティが多い投稿ほど上にあります)。

私の現在の試み(ソート方法を使用)はうまくいきます:

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)

は、私のお気に入りの新しい (私にとって) ActiveRecord トリックmergeの 1 つである をフィルター処理します。joins

では、フィルタリングだけでなく、共通のコミュニティ数による順序付けに同様の方法を適用するにはどうすればよいでしょうか? ここでは、次のようにします。

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は、community_posts ごとに個別の投稿結果を作成します。次に、 と を使用して、groupユーザーCOUNTと投稿の間で一致する個別のコミュニティによってデータベース内のこれらの結果をグループ化します。

のため、select返される各レコードは Post のように見えますが、 にも応答しpost.community_countます。

于 2013-07-03T17:54:06.077 に答える