2017-08-09 19 views
0

TagモデルとのHABTM関連のUserモデルがあります。必ずしも1つではなく、すべての条件を必ず持っているすべてusersが必要です。Railsクエリの関連性AND

例:ID 2および/または3でtagsを持っていますが、私は私が考えることができるIDS 2と3

答えて

2

tagsを持っているusersを返したい

User.includes(:tags).where(tags: { id: [2,3,...] }) 

戻りusers

User.includes(:tags).where(tags: { id: 2 }).where(tags: { id: 3 }) 

あなたがseverals tag_idsを持っている場合は、ユーザーとtとの間に中間テーブルの場合:このオプションのあなたがincludesを引き続き使用したい場合はAGSはuser_tags

tag_ids = [1, 2, 3, 4, 5] 
where = tag_ids.map do |id| 
    "tags.id = #{id}" 
end.join(" AND ") 

puts where # "tags.id = 1 AND tags.id = 2 AND tags.id = 3 AND tags.id = 4 AND tags.id = 5" 

User.joins("INNER JOIN user_tags ON user_tags.user_id = user.id INNER JOIN tags ON tags.id = user_tags.tag_id").where(where) 

で、レールっぽい方法でどこを継続して使用する他に選択肢はありません。

+1

'tags.id'が100個の場合はどうなりますか? –

+0

どちらが中間テーブルですか? – MatayoshiMariano

+0

@ m.simonborg 100 'tags.id'sに関する質問を更新しました – MatayoshiMariano

1

方法について:

user_ids = Tag.where(id: [2,3]).pluck(:user_id).uniq 
User.where(id: user_id) 

pluck、これは理想的ではないかもしれないが、それは少なくともかなりの速さが必要となりますので、すべてのタグオブジェクトをインスタンス化しません。

+0

タグオブジェクトがインスタンス化されていないにもかかわらず、これの欠点は1つではなく2つのクエリを実行していることです。 – MatayoshiMariano

関連する問題