2015-01-15 52 views
1

我有一个连接表一个用户组许多一对多关联(group_partecipations),其还具有一个额外的“状态”栏,其采用下列值:滑轨,查询相关的记录的条件

  • “所有者”(当存在对于给定的GROUP_IDUSER_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”吗?

回答

1

这样共可接受的解决方案。

然而它可以被改进,以使较少的查询到db。目前你对每个own_group执行一个单独的查询,IO操作比cpu操作慢多倍,因此,一次加载所有必要的数据然后处理它是一种更好的策略。

Group.includes(group_participations: :user) 
    where(group_participations: {status: "pending" }). 
    where(id: user.groups.where(group_participations: {status: "owner" }).ids). 
    map { |g| [g, g.users]} 
+0

谢谢,但问题的关键是:有没有一种方法可以从查询中过滤掉(或避免首先包括)所有不是“挂起”的用户(“所有者”和“接受”),以便不必稍后迭代查询结果来收集那些“待处理”出来?我试图学习AR查询,所以我想先了解如何挤出最大值(从数据库中得到我所需要的),以防万一我还没有完全做到这一点。之后,我将前往优化(并且已经为我提供了一些有用的见解) – 2015-01-17 02:12:26

+0

另外我也没有理解'(group_participations :: users)'中包含嵌套关联背后的原因?AR提供了一个关于“group_partecipation”没有“用户”关联的错误。如果我输入n ested关联单数形式“:用户”没有错误,但我不知道这意味着什么。 – 2015-01-17 03:31:58

+0

Plz将精确的关系定义添加到问题中。我没有运行查询,但它应该只包括所需的用户,如你所说。我会在明天详细检查这个 – 2015-01-17 10:34:07