我有用户组与连接表( 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)所以不必在以后迭代查询结果来收集那些“待定”的“出去?”答案 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]}