如果一個用戶有一組附加的角色,并且每個角色都有一組作用域,我如何檢查該用戶是否擁有所有的作用域
。例如,我有一個角色到作用域的映射
scopes_for_roles = {
artist: ['draw', 'sing'],
教師: ['read', 'write']。
運動員: ['繪圖', '閱讀', '舞蹈'] 。
}
對于擁有運動員和教師角色的用戶_A,我如何檢查(回傳T/F)他/她是否擁有下列作用域?
scopes = ['read'/span>, 'write'/span>] --> TRUE
scopes = ['sing', 'read', 'write', 'dance'] --> FALSE # 缺少唱歌。
我所嘗試的是下面的方法
roles.product(scopes).select { |role, scope|scopes_for_roles[role]. include? (scope) if scopes_for_roles.key? (role) }.size >= scopes.size
然而,我相信上面的代碼段有一個錯誤,它只檢查所選擇的permutations的.size而不是實際的scopes本身。因此,如果一個用戶擁有teacher和athlete的角色,該代碼段將回傳true,因為'read'在teacher和athlete的角色中發現兩次。
注意:我可以有幾個for回圈,并進行鍵值檢查,但我想知道是否有一個更干凈/更簡短的方法,就像我提供的片段一樣
。
uj5u.com熱心網友回復:
是的,當你依賴計數時,重復的作用域是一個問題。要繼續使用這種方法,你將需要應用Array#uniq來在某些時候洗掉重復的。(另外,includes_code?不是一個Ruby方法。) 我建議你放棄計數方法。首先從scopes_for_roles中提取相關的作用域:
roles = [:運動員, :教師]
范圍 = ['read', 'write']
a = scopes_for_roles.values_at(*roles)
#=> [["draw", "read", "dance"], ["read", "write"]]/span>
在這一點上,你有幾個選擇。也許最簡單的是首先將a平移:
b = a.flatten
#=> ["畫", "讀", "舞", "讀", "寫"]
然后執行下面的一個步驟:
scopes.all? { |s| b.include?(s) }
#=> true
(scopes - b).empty?
#=> true (scopes - b #=> [])
scopes & b == scopes
#=> true (scopes & b #=> ['write', 'dance'])
代替flatten,你可以使用
b = a.reduce(: )
#=> ["畫", "讀", "舞", "讀", "寫"]
或者
b = a.reduce(:|)
#=> ["畫", "讀", "舞", "寫"]
參見Array#|。
如果
scopes = ['sing', 'read', 'write', 'dance']
那么
scopes.all? { |s| b.include?(s) }
#=> false
(scopes - b).empty?
#=> false(scopes - b #=> ['sing'])
scopes & b == scopes
#=> false (scopes & b #=> ['讀', '寫', '舞'])
我建議如下。
我建議如下。
def have_em_all?(scopes_for_roles, roles, scopes)
(scopes - scopes_for_roles.values_at(*roles).reduce(:|)). empty?
end。
roles = [:運動員, :教師]
范圍1 = ['讀'/span>, '寫'/span>]
scopes2 = ['sing', 'read', 'write', 'dance']
have_em_all? (scopes_for_roles, roles, scopes1) #=> true
have_em_all? (scopes_for_roles, roles, scopes2) #=> false
對于第一個例子,步驟如下。
a = scopes_for_roles.values_at(*roles)
#=> [["draw", "read", "dance"], ["read", "write"]]/span>
b = a.reduce(: |)
#=> ["畫", "讀", "舞", "寫"]
c = scopes1 - b
#=> []
c.空嗎?
#=> true
在第二個例子中,我們將得到
c = scopes2 - b
#=> ["sing"]
c.空嗎?
#=> false c.empty?
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/323816.html
標籤:
