如何让拥有这些标签的所有用户?

时间:2015-06-09 17:27:56

标签: sql ruby-on-rails activerecord has-and-belongs-to-many

User has_and_belongs_to_many tags
Tag has_and_belongs_to_many users

我正在寻找一种方法,让每个标签25的用户都有一个查询,最好使用activerecord构建。

我知道我可以做到这一点

users1 = Tag.find(2).users
users2 = Tag.find(5).users
usersFinal = users1 & users2

但是我想获取用户列表并将它们与SQL合并以防止在ruby中合并数组。

编辑:我正在使用mysql2

2 个答案:

答案 0 :(得分:1)

您应该使用map方法:

Tag.find([2,5]).map(&:users)

EDIT2

您还可以使用包含

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

答案 1 :(得分:1)

假设您有user_tags表来支持您的多对多关系,我会使用以下SQL来执行此操作:

SELECT users.id, COUNT(user_tags.tag_id) as tags_count 
FROM users
JOIN user_tags ON users.id = user_tags.user_id
WHERE user_tags.tag_id IN (2,5)
GROUP BY users.id
HAVING COUNT(user_tags.tag_id) > 1;

在这里,我们选择带有任何给定标记的users(eighter 25),组行,以便每行代表一个用户,并检查"嵌套"行(等于user_tags表中特定用户的引用计数)。假设你有唯一性验证,保证一对usertag只有一行,那么两个用户都有超过1行"嵌套&# 34; (having COUNT(*) > 1)。

很抱歉没有能够自己测试,希望能为您提供见解。请参阅HAVING (SQL)函数定义。