背景:I在边缘Rails (4.1.0.rc1)。用户通过CommunityUser模型拥有多个社区。以下用户属于不同的社区:
USERS TABLE
ID | COMMUNITY_IDS
---|--------------
1 | [2, 7, 8]
2 | [3, 4, 8]
3 | [4, 5, 7]
4 | [3, 5, 7]
5 | [3, 8, 10]
6 | [4, 6, 7]
7 | [1, 8, 10]
8 | [3, 8, 10]
9 | [2, 9, 10]
10 | [3, 6, 10]User.joins(:communities).where(communities:{id: 5,7}).uniq
返回与Community5或Community7关联的所有用户: SQL =>从"community_users“上的”用户“内联接”community_users“中选择不同的”用户“。”user_id“=”用户“。”id“在”社区“上加入”社区“。”id“=”community_users“。”community_id“(5,7)中的”id“。
ID | COMMUNITY_IDS
---|--------------
1 | [2, 7, 8]
3 | [4, 5, 7]
4 | [3, 5, 7]
6 | [4, 6, 7]通过添加另一个where子句返回空的ActiveRecord::Relation,试图进一步过滤这些内容(返回来自这个组的那些也与Community6相关联):
User.joins(:communities).where(communities:{id: 5,7}.where(社区:{id: 6}).uniq
=> SQL:从"community_users“上的”用户“内联接”community_users“中选择不同的”用户“.*。”user_id“=”用户“。”id“内加入”社区“上的”社区“。”id“=”community_users“。”community_id“,其中”社区“。”id“在(5,7)和”id“在(6)。
=> #<ActiveRecord::Relation []>目标:,这是这个查询的正确行为吗?如果是这样的话,我如何编写这个查询来返回与Community5或Community7关联的用户,以及如何返回与Community6关联的用户。
发布于 2014-03-09 23:09:26
问题在于,您在某种程度上考虑了community_ids,这是您在上面显示的。
ID | COMMUNITY_IDS
---|--------------
1 | [2, 7, 8]
3 | [4, 5, 7]
4 | [3, 5, 7]
6 | [4, 6, 7]实际上,您将得到以下中间结果集:
UID| COMMUNITY_ID
---|--------------
3 | 5
4 | 5
1 | 7
3 | 7
4 | 7
6 | 7然后你说:好吧,还有“社区”。“id”IN (6)!在结果集中没有任何社区具有这样的身份。
获得社区用户5,7
users = Community.where(id:[5,7]).map(&:users).flatten.uniq若要使用id=7通过社区过滤用户:
filtered = users.select{|u| u.communities.map(&:id).include?(6) }这段代码是工作的(它用id =6返回具有单个用户的数组),但这不是最好的解决方案。
发布于 2014-03-18 14:56:21
这个解决方案要求您自己编写连接查询,而不是使用Ruby。另一方面,这只是一个(快速) SQL查询,如果您经常比较社区,它的扩展性会更好。
正如Vitalyp指出的,CommunityUsers表如下所示
CommunityUsers
user_id | community_id
--------|--------------
1 | 5
2 | 5
1 | 7
2 | 7
1 | 6
3 | 6为了找到包含社区5或7以及6的记录,我们可以选择这两种记录并加入它们。
User.joins('INNER JOIN "community_users" c1 ON c1."user_id" = "users"."id" AND c1."id" IN [5, 7]')
.joins('INNER JOIN "community_users" c2 ON c2."user_id" = "users"."id" AND c2."id" = 6')使用内部联接,查询只选择社区5或7(第一个联接子句)和社区6(第二个联接子句)中的用户。
附加提示:在community_users.user_id上创建索引也会加快查询速度。
https://stackoverflow.com/questions/22287381
复制相似问题