3

我不得不通过模型权限模型角色和访问的的has_many关系。轨道/通过协会活动记录的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 

但这返回其访问标识具有的所有角色是1或2(说[1,2,3,4],[1],[2])。我需要的是获得其访问IDS正是1和2

这将是很好,如果我可以替代的作用“=>”与“==”在上面的查询:)但是,这显然是行不通的。

回答

0

不知道查询到这一个,但你可以通过红宝石得到角色做这个

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(:访问)触发三个查询,而Role.includes(:权限)只触发2部

+0

hmm..it作品,但不知何故似乎具有很多查询语句的循环结果。 Theres错误也应该是r.access_ids。我建议在数据库查询期间避免这种循环。 无论如何,谢谢 – prasvin

+0

您正在使用上面类似的循环来检查您上面显示的验证,这就是为什么我建议使用这种技术。如果您可以为上述验证提供更好的解决方案,则可以使用相同的查询来获取以下角色。 – Dipil