2017-08-09 101 views
0

我有一个User模型与HABTM协会与Tag模型。我需要所有users谁必须具备所有条件,而不仅仅是一个。Rails查询关联AND

例:

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

返回users谁拥有tags ID为2和/或3,但我想只返回users谁与IDS 2 tags和3

回答

2

我能想到的这个选项:

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

如果你有severals tag_ids,如果用户与T之间的中间表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) 

如果您希望继续使用该includes,没有其他的选择是继续使用其中轨道上下的方式。

+1

如果有100个'tags.id',该怎么办? –

+0

哪个是中间表? – MatayoshiMariano

+0

@ m.simonborg我已经更新了有关100个'tags.id'的问题 – MatayoshiMariano

1

如何:

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

pluck不会实例化的所有标签的对象,因此,虽然这可能不是理想的,它至少应该是相当快的。

+0

尽管标记对象没有实例化,但缺点是您正在执行两个查询而不是一个查询。 – MatayoshiMariano