【问题标题】:How to check if value is in array on CanCanCan hash of conditions如何检查值是否在 CanCanCan 条件散列的数组中
【发布时间】:2020-04-26 10:09:29
【问题描述】:

我有三个模型类:PatientBoardMedicationCustomer,它们相互关联如下:

病人委员会

associations do 
      has_and_belongs_to_many :customers
      has_many :medications
end

药物

associations do 
      belongs_to :patient_board
end

客户

associations do 
      has_many :patient_boards
end

由于has_and_belongs_to_many 关系,我的 patient_board 对象如下所示:

{
  _id: ObjectId("5e160f235eb3607d57f59341"), 
  name: "test",
  customer_ids: [ObjectId("5db1e6f45eb36059a4d98e7f")]
}

有权访问该患者委员会的所有客户的 id 将位于 customer_ids 数组中。

问题

在尝试为用户设置权限时,我对PatientBoard 进行了如下操作:

can :manage, PatientBoard do |pb|
    pb.customer_ids.include? user.id
end

它在大多数情况下都有效。但是create 方法还是不行,所以我也必须插入以下行:

can :create, PatientBoard

现在它可以正常工作了,但是当我尝试对 Medication 做同样的事情时它没有工作:

can :manage, Medication do |m|
    m.patient_board.customer_ids.include? user.id
end

它抛出这个错误信息:

accessible_by 调用不能与块“can”定义一起使用。无法确定 :index 药物的 SQL

所以我尝试这样做:

can :manage, Medication, patient_board: { customers: { id: user.id } }

这样就不会再显示错误消息,但药物也不会显示。当尝试创建一种新药物时,它会抛出该错误:

未定义的方法“匹配?”对于#PatientBoard:0x007f663c38d0e8 你是说什么? _火柴?匹配器

我认为这是有道理的,因为它试图将字符串值 (user.id) 与数组值 (customer_ids) 进行比较

在简历中

如何使用 CanCanCan 的条件哈希检查 user.id 是否在 customer_ids 数组中?

【问题讨论】:

    标签: ruby-on-rails ruby mongodb mongoid cancancan


    【解决方案1】:

    看起来include? 正在触发can 块内的sql 查询。尝试将 customer_ids 转换为数组:

    can :manage, Medication do |m|
      m.patient_board.customer_ids.to_a.include? user.id
    end
    

    【讨论】:

      【解决方案2】:

      所以,我在 CanCan github 上查看了issue #345 后设法解决了这个问题。

      显然,我必须提供一个 sql 查询来匹配药物,所以我这样做了:

      can [:manage], [Medication], ["#{user.id} in ( select customer_ids from patient_board where id = medications.patient_board.id ) )"] do |t|
         t.patient_board.customer_ids.include? user.
      end
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-09-09
        • 1970-01-01
        相关资源
        最近更新 更多