Rails / Active Record has_many通过关联 - 获取记录

时间:2011-11-18 07:52:26

标签: mysql ruby-on-rails activerecord ruby-on-rails-3.1 has-many-through

我通过模型权限与模型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的角色。

如果我可以替换'=>'那就太好了在上面的查询中使用'=='但是这显然不起作用。

1 个答案:

答案 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)仅触发两个