簡體   English   中英

ID不為零時允許訪問cancan / cancancan

[英]Allowing access cancan / cancancan when id is not nil

我正在嘗試使用cancan授予存在關聯的位置。

它需要同時處理對象屬性和accessible_by選擇(因此,我不能使用塊,除非有人告訴我如何解決該錯誤)。

我想出了一個殘酷的辦法。

lead.rb
has_many :recordings
has_many :emails

ability.rb

can :manage, Lead
can :manage, Recording, :lead_id => (1..Lead.pluck(:id).max).to_a
can :manage, Email, :lead_id => (1..Lead.pluck(:id).max).to_a

我的意思是lead_id不為null ...

有什么辦法可以做到,而不必每次都創建100,000個項目數組?


額外信息:值得注意的是,這些不是Recording and Emails模型上唯一的控件,因此,我可以添加額外的權限,而不是重置並負面地表達它們,這一點很重要。

有兩種方法可以實現此目的:

1.綜合能力

這是推薦的方法 除非有充分的理由,否則請使用此選項。

這里的想法是 cannot能力與can結合在一起:

can :manage, Recording
cannot :manage, Recording, lead_id: nil

請注意,這里的順序很重要 ,因此規則覆蓋是正確的。

2.一組能力

通過使用塊定義功能 ,您可以形成更復雜的查詢。

一個簡單的實現如下:

can :manage, Recording do |recording|
  !recording.lead_id.nil?
end

但是,為了將此功能與其他功能結合使用,在獲取記錄時還必須指定SQL條件 此額外的SQL控制load_resource操作,例如index

can :manage, Recording, ["lead_id IS NOT NULL"] do |recording|
  !recording.lead_id.nil?
end

為了使此邏輯保持DRY,還可以考慮在一個塊中定義權限,例如:

[Recording, Email].each do |model|
  can :manage, model
  cannot :manage, model, lead_id: nil
end

我有這個需求,這里的解決方案可能要快得多。 您無需pluck訪問數據庫,也沒有理由將范圍更改為數組,因為檢查范圍可以正常工作(我不確定這是否在庫內部使用了范圍,但理想情況下是這樣將)。

can :manage, [Recording, Email], :lead_id => (1..(2**31-1))

我正在用cancancan

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM