我有User
模型,其中HABTM与Tag
模型关联。我需要所有必须拥有所有条件的users
,而不仅仅是一个。
例如:
User.includes(:tags).where(tags: { id: [2,3,...] })
返回users
tags
且ID为2和/或3的users
,但我只想返回tags
{{1}}个ID为2 AND 3的人。 / p>
答案 0 :(得分:2)
我可以想到这个选项:
User.includes(:tags).where(tags: { id: 2 }).where(tags: { id: 3 })
如果您有多个tag_ids
,并且用户和代码之间的中间表是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
,则没有其他选择继续使用rails-ish方式中的where。
答案 1 :(得分:1)
怎么样:
user_ids = Tag.where(id: [2,3]).pluck(:user_id).uniq
User.where(id: user_id)
pluck
不会实例化所有标记对象,所以虽然这可能不太理想,但至少应该很快。