2

データベースに2つのエントリがあります

Obj1は「hello、world、planet」でタグ付けされていますObj2は「hello」でタグ付けされています

modelName.tagged_with(["hello"、 "world"、 "planet"、 "earth"]、:any => true)を実行した場合

返されたオブジェクトを、一致したタグの数が多いものから少ないものの順に並べ替えたいと思います。したがって、この場合、順序をObj1、Obj2にします。

これどうやってするの?返された結果のそれぞれに一致するタグの数を取得する方法はありますか?

4

2 に答える 2

3

tag_listオブジェクトを呼び出し、それを使用して、タグがいくつあるかを把握できます。

tags = %w{hello world planet earth}
objs = ModelName.taggedWith(tags, :any => true)
objs.sort_by! { |o| -(tags & o.tag_list).length }

tags & o.tag_listは、探しているタグと見つかったタグの交差を生成します。次に、交差のサイズを否定して(sort_by昇順で並べ替え)、より大きな交差を前面に配置するように指示します。結果を否定するのは簡単な方法です。通常のソート順を逆にします。

于 2011-01-12T08:02:52.677 に答える