0

たとえば、Post モデルと Tag モデルを使用したシンプルなアプリがあります。それらは has-many として互いに関連していました。任意の数のタグに関連付けられている投稿を見つける必要があります。たとえば、「Cat」および「Forest」タグでタグ付けされているが、「Forest」または「Cat」でタグ付けされていないすべての投稿を検索したい。だから、森には猫しかいない。

Railsまたは生のSQLでそのようなクエリを実行するにはどうすればよいですか? 関連付けられたモデルで IN 演算子を使用すると、

PostTag.where(tag_id: [1,2])

この 2 つのタグのいずれかで Post を取得しますが、交差点が必要です。どうやってやるの?

4

1 に答える 1

0

1つの刺し傷は、次のようなことをすることです:

post_tag_ids = PostTag.joins(:tags).where('tags.id = 1').pluck(:id) & PostTag.joins(:tags).where('tags.id = 2').pluck(:id)
post_tags = PostTag.find(post_tag_ids)

またはさらに良い

(PostTag.joins(:tags).where('tags.id = 1') & PostTag.joins(:tags).where('tags.id = 2')).uniq

したがって、最初にタグ 1、次にタグ 2 を持つ投稿の post_tag ID を見つけてから、2 つのセットの交差を取得し、それらをクエリします。

ほとんどの場合、最も簡単な方法が目の前にある場合でも、人々はレールに 1 つのライナーでタスクを達成しようとします。ただし、これにより 3 つのクエリが発生するため、その点に注意してください。これをSQLで行う場合、サブクエリを使用しても同じことになります。

于 2013-05-14T20:23:10.970 に答える