[英]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模型上唯一的控件,因此,我可以添加額外的權限,而不是重置並負面地表達它們,這一點很重要。
有兩種方法可以實現此目的:
這是推薦的方法 。 除非有充分的理由,否則請使用此選項。
這里的想法是將 cannot
能力與can
結合在一起:
can :manage, Recording
cannot :manage, Recording, lead_id: nil
請注意,這里的順序很重要 ,因此規則覆蓋是正確的。
通過使用塊定義功能 ,您可以形成更復雜的查詢。
一個簡單的實現如下:
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.