Rails查询关联AND

时间:2017-08-09 14:33:38

标签: ruby-on-rails ruby activerecord

我有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>

2 个答案:

答案 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不会实例化所有标记对象,所以虽然这可能不太理想,但至少应该很快。