我有一个User
模型与HABTM协会与Tag
模型。我需要所有users
谁必须具备所有条件,而不仅仅是一个。Rails查询关联AND
例:
User.includes(:tags).where(tags: { id: [2,3,...] })
返回users
谁拥有tags
ID为2和/或3,但我想只返回users
谁与IDS 2 tags
和3
我有一个User
模型与HABTM协会与Tag
模型。我需要所有users
谁必须具备所有条件,而不仅仅是一个。Rails查询关联AND
例:
User.includes(:tags).where(tags: { id: [2,3,...] })
返回users
谁拥有tags
ID为2和/或3,但我想只返回users
谁与IDS 2 tags
和3
我能想到的这个选项:
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
,没有其他的选择是继续使用其中轨道上下的方式。
如何:
user_ids = Tag.where(id: [2,3]).pluck(:user_id).uniq
User.where(id: user_id)
pluck
不会实例化的所有标签的对象,因此,虽然这可能不是理想的,它至少应该是相当快的。
尽管标记对象没有实例化,但缺点是您正在执行两个查询而不是一个查询。 – MatayoshiMariano
如果有100个'tags.id',该怎么办? –
哪个是中间表? – MatayoshiMariano
@ m.simonborg我已经更新了有关100个'tags.id'的问题 – MatayoshiMariano