首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >链接了has_many上的where子句:通过关联(Rails 4.1.0.rc1)

链接了has_many上的where子句:通过关联(Rails 4.1.0.rc1)
EN

Stack Overflow用户
提问于 2014-03-09 19:59:07
回答 2查看 374关注 0票数 1

背景:I在边缘Rails (4.1.0.rc1)。用户通过CommunityUser模型拥有多个社区。以下用户属于不同的社区:

代码语言:javascript
复制
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“。

代码语言:javascript
复制
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)。

代码语言:javascript
复制
=> #<ActiveRecord::Relation []>

目标:,这是这个查询的正确行为吗?如果是这样的话,我如何编写这个查询来返回与Community5或Community7关联的用户,以及如何返回与Community6关联的用户。

EN

回答 2

Stack Overflow用户

发布于 2014-03-09 23:09:26

问题在于,您在某种程度上考虑了community_ids,这是您在上面显示的。

代码语言:javascript
复制
ID | COMMUNITY_IDS
---|--------------
1  | [2, 7, 8]
3  | [4, 5, 7]
4  | [3, 5, 7]
6  | [4, 6, 7]

实际上,您将得到以下中间结果集:

代码语言:javascript
复制
UID| COMMUNITY_ID
---|--------------
3  | 5
4  | 5
1  | 7
3  | 7
4  | 7
6  | 7

然后你说:好吧,还有“社区”。“id”IN (6)!在结果集中没有任何社区具有这样的身份。

获得社区用户5,7

代码语言:javascript
复制
users = Community.where(id:[5,7]).map(&:users).flatten.uniq

若要使用id=7通过社区过滤用户:

代码语言:javascript
复制
filtered = users.select{|u| u.communities.map(&:id).include?(6) }

这段代码是工作的(它用id =6返回具有单个用户的数组),但这不是最好的解决方案。

票数 4
EN

Stack Overflow用户

发布于 2014-03-18 14:56:21

这个解决方案要求您自己编写连接查询,而不是使用Ruby。另一方面,这只是一个(快速) SQL查询,如果您经常比较社区,它的扩展性会更好。

正如Vitalyp指出的,CommunityUsers表如下所示

代码语言:javascript
复制
CommunityUsers
user_id | community_id
--------|--------------
 1      | 5
 2      | 5
 1      | 7
 2      | 7
 1      | 6
 3      | 6

为了找到包含社区5或7以及6的记录,我们可以选择这两种记录并加入它们。

代码语言:javascript
复制
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上创建索引也会加快查询速度。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22287381

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档