2

ブログアプリにタグ付けシステムを実装しています。このアプリには投稿があり、投稿にはタグ付けを通じて多くのタグがあります。RailCasts#382http : //railscasts.com/episodes/382-taggingのように多かれ少なかれ

チェックボックスを使用して、次のような複数のタグを持つ投稿を選択します。

Post.joins(:tags).where(:tags => { :id => [tag_ids] } )

しかし、1つの要件のみを満たす投稿ではなく、必要なすべてのタグを持つ投稿に参加したい場合はどうなりますか?

例:

Post1には「foo、bar、baz」というタグがあります

Post2には「bar、baz」というタグがあります

Post3にはタグ「bar」があります

["bar"、 "baz"]を検索すると、メソッドは投稿1、2、および3を返します。投稿1と2のみを返したい場合はどうすればよいですか?

4

1 に答える 1

3

SQLでは、次のようなことを行います

GROUP BY posts.id
HAVING count(tags.name) = 2

Railsでは次のように変換されます

Post.joins(:tags).select('posts.id').where(:tags => { :id => [tag_ids] }
).having("count(tags.name) = ?", tag_ids.count).group('posts.id')

上記のコードは、tag_idsがIDの配列であることを前提としています。また、返されたActiveRecordPostオブジェクトのセットのIDのみをロードします。

さらにフィールドをロードする場合は、それらを呼び出しに追加するselectか、呼び出しを削除してselectすべてのPostフィールドをロードします。group結果のSQLクエリで取得されるPostのすべての列/フィールドについて、そのフィールドを呼び出しに追加する必要があることを覚えておいてください。

于 2012-09-25T01:22:20.653 に答える