我通过模型权限与模型Role和Access建立了has_many关系。
我的情况是,没有两个角色应该具有相同的访问权限。因此,我创建了一个自定义验证,当使用时为当前角色(正在创建)分配与以前存在的角色相同的访问时,基本上会产生错误消息,
errors.add(:Role, "already exists with selected permissions") if Role.all.map(&:access_ids).include?(self.access_ids)
一切正常。现在我需要获取与当前角色具有相同访问权限的角色。那么,我该怎么做?我试过
Role.includes(:accesses).where(:accesses => {:id => [1,2]}).count
但是这会返回访问ID为1或2的所有角色(比如[1,2,3,4],[1],[2])。我需要的是获得其访问ID正好为1和2的角色。
如果我可以替换'=>'那就太好了在上面的查询中使用'=='但是这显然不起作用。
答案 0 :(得分:0)
不知道对此问题的查询,但您可以通过ruby执行此操作
Role.all.to_a.find{|r| r.access_ids == self.access_ids}
作为对您下面评论的回复,这会引发太多查询,请使用此方法,该方法只会触发2个查询。
Role.includes(:permissions).find{|r| r.permissions.map(&:access_id) == self.access_ids}
您也可以将其用于验证,
Role.includes(:permissions).any?{|r| r.permissions.map(&:access_id) == self.access_ids}
您建议Role.includes(:accesses)触发三个查询,而Role.includes(:permissions)仅触发两个