我有一个连接表一个用户组许多一对多关联(group_partecipations),其还具有一个额外的“状态”栏,其采用下列值:滑轨,查询相关的记录的条件
“所有者”(当存在对于给定的GROUP_ID和USER_ID对没有其它记录被自动设置:这意味着该用户是该组的创建者/所有者)
“待定”(这是当用户加入的群组设置的默认值,但他们不是创造者,这意味着他们正在等待群组创建者接受他们)
“接受”(当创建者接受未决用户)
我明白,DB规范化规则,我应该在另一个表中提取此列,但现在我会离开它这样。
所以..现在,我试图创建一个查询,对于给定的用户,他所拥有的所有组以及与该组的用户一起处于“挂起”状态。
虽然我找到了一个解决方案,但它感觉非常复杂,我真的不确定这是一个好方法,所以我想要一些建议。
这就是我想出了:
首先,我发现所有组,其中用户是所有者:
groups_where_owner = u.groups.where(group_partecipations: {status: "owner" })
# u.groups would return all groups:
# either those in which user is owner and those where he is pending or has been accepted
然后对每一个他自己的小组中我回发集团本身的数组在“待定”的用户:
groups_where_owner.map { |g|
[ g,
User.includes(:group_partecipations).where
(:group_partecipations => {:group_id => g.id, status: "pending" })
]
}
但正如我所说,这种感觉脏和太多的“手工制作”,我想了解,如果我为了对付没有错过在ActiveRecord的一个重要组成部分有了这种情况。
另外,当我将结果转换为JSON ojbect时,它有一个额外的嵌套层次,我希望避免这种嵌套。
所以..有没有更好的方法?或者,什么是正确的方法?
在此先感谢您的帮助。
编辑:我的问题的关键点是:有没有办法修改我的AR查询,以过滤掉(或避免包括在第一个地方)所有的用户谁不是“挂起”(“所有者”s和“接受的”或多个),从而不具有稍后查询结果迭代以收集那些“未决的” s”吗?
谢谢,但问题的关键是:有没有一种方法可以从查询中过滤掉(或避免首先包括)所有不是“挂起”的用户(“所有者”和“接受”),以便不必稍后迭代查询结果来收集那些“待处理”出来?我试图学习AR查询,所以我想先了解如何挤出最大值(从数据库中得到我所需要的),以防万一我还没有完全做到这一点。之后,我将前往优化(并且已经为我提供了一些有用的见解) – 2015-01-17 02:12:26
另外我也没有理解'(group_participations :: users)'中包含嵌套关联背后的原因?AR提供了一个关于“group_partecipation”没有“用户”关联的错误。如果我输入n ested关联单数形式“:用户”没有错误,但我不知道这意味着什么。 – 2015-01-17 03:31:58
Plz将精确的关系定义添加到问题中。我没有运行查询,但它应该只包括所需的用户,如你所说。我会在明天详细检查这个 – 2015-01-17 10:34:07