1

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'
)
4

1 に答える 1

1
Recording.joins(:tags).where(:tags => { :id => [5,6,7] })

これはうまくいくはずだと思います(ただし、:through関連付けでうまくいくかどうかはわかりません)。試してみる。

于 2012-10-06T23:09:12.610 に答える