2016-06-27 6 views
2

モデルNotehas_and_belongs_to_many:Tagsです。モデルはすべてのアソシエーションを持っています。

少なくともID:12の両方のタグを持つメモをすべて検索したいと思います。これは、ID 1または2のいずれかでタグを持っているすべてのNotesを返します

​​

現在、私はこれを持っています。

両方のタグを持つメモを返信したいと思います。それは2つ以上のタグを持つことができますが、少なくとも2つのタグを持つ必要があります。

どのような考えですか?私はRails 4を使用しています。

答えて

1

私は決してこれに対する良い解決策を見出しませんでした。しかし、あなたが良いものを見つけられない場合に備えて、私は自分の解決策を共有しています。あなたは

Note.includes(:tags).where(tags: { id: 1 }).references(:tags) && Note.includes(:tags).where(tags: { id: 2 }).references(:tags) 

は驚くべき それだけで1つのSQLクエリコストとそれが動作し、このようにそれを行うことができます。配列に応じてこのようなチェーンを作成し、 evalを実行するメソッドを書くことができます。

0

どこの呼び出しでSQL構文を試してみることができますか?おそらく

何かのように:

Note.includes(:tags).where('EXISTS(SELECT 1 from tags where id = 1 and note_id = notes.id) and EXISTS(select 1 from tags where id = 2 and note_id = notes.id)').references(:tags).uniq 
0

あなたがチェーン2つのwheres

.where(tags: { id: 1 }).where(tags: { id: 2 }) 
0

あなたがタグ非常に簡単にチェーン2ことができます。

Note.includes(:tags).where(tags: { id: 1 }).where(tags: { id: 2 }).references(:tags) 
関連する問題