【问题标题】:Rails / Active Record has_many through association - fetching a recordRails / Active Record has_many 通过关联 - 获取记录
【发布时间】:2012-01-01 00:48:04
【问题描述】:

我通过模型权限拥有模型角色和访问权限的 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 的角色。

如果我可以在上述查询中将 '=>' 替换为 '==' 那就太好了 :) 但这显然行不通。

【问题讨论】:

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


    【解决方案1】:

    不知道对这个的查询,但是你可以通过 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) 只触发两个

    【讨论】:

    • hmm..它可以工作,但不知何故,似乎有一个循环会导致很多查询语句。还有一个错字,应该是 r.access_ids。我被建议在数据库查询期间避免这种循环。无论如何,谢谢
    • 您正在使用上面的类似循环来检查您在上面显示的验证,这就是我建议使用这种技术的原因。如果您能为上面的验证提出更好的解决方案,您可以使用相同的查询来获取下面的角色。
    猜你喜欢
    • 2012-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-16
    • 1970-01-01
    • 2015-05-17
    相关资源
    最近更新 更多