1

背景:投稿とユーザーがあり、どちらも HABTM コミュニティです。私の投稿モデルには、特定のユーザーに対する投稿の関連性を計算するための方法があります。これは、ユーザーが共有しているコミュニティの数を比較することによって行われます。

def relevance(user)
  (self.communities & user.communities).length
end

目的:特定の関連性によって投稿をクエリすること。

Post.where(:relevance => 3)

また

すべての投稿をクエリし、関連性で並べ替えます。

Post.all.desc(:relevance)

ユーザー変数がどこかに必要であることはわかっていますが、このようなことが可能かどうか、または回避策が存在するかどうか疑問に思っています。

4

1 に答える 1

0

これは、 Aggregation Framework(バージョン2.2の新機能)を使用してmongoDBで実行できます。

一連のユーザーのコミュニティを利用できるようにする必要があります。この例では、これをuserCommsと呼びます。posts.communitiesと同じタイプの値を持つ配列であると期待しています。

db.posts.aggregate( [
    {
        "$unwind" : "$communities"
    },
    {
        "$match" : {
            "communities" : {
                "$in" : userComms
            }
        }
    },
    {
        "$group" : {
            "_id" : "$_id",
            "relevance" : {
                "$sum" : 1
            }
        }
    },
    {
        "$sort" : {
            "relevance" : -1
        }
    }
]);

これにより、次の形式のドキュメントが返されます。

{
    "result" : [
        {
            "_id" : 1,
            "relevance" : 4
        },
        {
            "_id" : 6,
            "relevance" : 3
        },
...
        ]
}

結果の配列には、投稿の_idが含まれ、ユーザーと共通のコミュニティの数を加算して計算された関連性があります。次に、その合計でソート(降順)されます。

于 2012-08-28T23:00:05.637 に答える