Rails,查询条件相关的记录

时间:2015-01-15 16:19:15

标签: ruby-on-rails activerecord many-to-many associations

我有用户组与连接表( group_partecipations )的多对多关联,该连接表还有一个额外的“状态”列,其中包含以下值:

  • “owner”(当给定的 group_id user_id 对没有其他记录时自动设置:这意味着该用户是创建者/该组的所有者)

  • “pending”(这是用户加入群组时设置的默认值,但他们不是创建者,这意味着他们正在等待群组创建者接受它们)

  • “已接受”(当创作者接受待定用户时)

据我所知,对于数据库规范化规则,我应该在另一个表中提取此列,但现在我将保留它。

所以..现在,我正在尝试为给定用户创建一个查询,为他所有的所有组以及该组中具有“待处理”状态的用户提供保留。

虽然我找到了一个解决方案,但感觉非常复杂,我真的不确定这是一个好方法,所以我想要一些建议。

以下是我提出的建议:

首先,我找到用户所有者的所有组:

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)所以不必在以后迭代查询结果来收集那些“待定”的“出去?”

1 个答案:

答案 0 :(得分:1)

这是一个完全可以接受的解决方案。

但是可以改进以减少对db的查询。此时,您为每个owned_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]}