3 つのテーブル/モデルがあります。
Recordings (id)
has_many :hits
has_many :tags, :through => :hits
Hits (id, recording_id, tag_id)
belongs_to :recordings
belongs_to :tags
Tags (id)
has_many :hits
has_many :recordings, :through => :hits
パラメータとして渡されるすべてのタグを持つすべての録音を見つける必要があります。たとえば、tag.id == 5、tag.id == 6、および tag.id ==7 を持つすべてのレコーディングを検索します。(ただし、2 つのタグ ID または 2000 のタグ ID の可能性があります)
大きなセットを取り戻してルビーで減らすのではなく、高速になるように、データベースへのクエリでこれを実行しようとしています。
SQL クエリは次のようになります。
SELECT * FROM recordings
WHERE id IN (
SELECT recording_id FROM hits
WHERE recording_id IN (
SELECT recording_id FROM hits
WHERE recording_id IN (
SELECT recording_id from hits WHERE recording_id = 5
)
AND tag_id = '6'
)
AND tag_id == '7'
)