Ruby on rails Rails查询关联和

Ruby on rails Rails查询关联和,ruby-on-rails,ruby,activerecord,Ruby On Rails,Ruby,Activerecord,我有一个用户模型,它与标签模型有一个HABTM关联。我需要所有用户,他们必须具备所有条件,而不仅仅是一个条件 例: 返回具有id为2和/或3的标记的用户,但我只想返回具有id为2和3的标记的用户。我可以考虑以下选项: User.includes(:tags).where(tags: { id: 2 }).where(tags: { id: 3 }) 如果您有几个tag\u id,并且如果用户和标记之间的中间表是user\u tags tag_ids = [1, 2, 3, 4, 5] wher

我有一个
用户
模型,它与
标签
模型有一个HABTM关联。我需要所有
用户
,他们必须具备所有条件,而不仅仅是一个条件

例:


返回具有id为2和/或3的
标记的
用户
,但我只想返回具有id为2和3的
标记的
用户。

我可以考虑以下选项:

User.includes(:tags).where(tags: { id: 2 }).where(tags: { id: 3 })
如果您有几个
tag\u id
,并且如果用户和标记之间的中间表是
user\u 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)

如果您希望继续使用
包含
,则没有其他选择可以继续以rails的方式使用where。

我可以考虑以下选项:

User.includes(:tags).where(tags: { id: 2 }).where(tags: { id: 3 })
如果您有几个
tag\u id
,并且如果用户和标记之间的中间表是
user\u 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)
如果您希望继续使用包含的
,则没有其他选择可以继续使用where in the rails ish方式。

如何:

user_ids = Tag.where(id: [2,3]).pluck(:user_id).uniq
User.where(id: user_id)
pulk
不会实例化所有标记对象,因此虽然这可能不理想,但至少应该非常快。

如何:

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

pulk
不会实例化所有标记对象,因此虽然这可能不理想,但至少应该相当快。

尽管标记对象没有实例化,但其缺点是您要执行两个查询,而不是一个查询。尽管标记对象没有实例化,这样做的缺点是,您正在执行两个查询,而不是一个查询。如果有100个
tags.id
s怎么办?哪一个是中间表?@m.simonborg我已经更新了关于100个
tags.id
s的问题。如果有100个
tags.id
s怎么办?哪一个是中间表?@m.simonborg我已经更新了问题关于100个
tags.id
s