是否有任何DRYer方法来编写此方法?或者更好地保持这种方式以便更好地理解读者...
每个角色都有一个特定资源的授权活动列表(在本例中为Sheet),用户可能有多个角色(取决于他的公司,他在公司的工作组,他在工作组中的职能)。此方法是sheet_policy,如果在所有角色中,当前用户可以“索引”工作表,则该方法返回true,否则返回false
def index?
# check if sheet#index is listed in current_user roles activities
sheet_activities = []
user.roles.each {|role| sheet_activities << role.activities["sheet"]}
return false if sheet_activities.first.nil? # no authorized activities on Sheet
sheet_activities.flatten.uniq!.include?("index")
end
活动是Sheet记录的JSONB属性...
create_table :roles do |t|
t.string :company, null: false, default: Settings.company.default.name
t.string :group
t.string :function
t.jsonb :activities, null: false, default: '{}'
t.timestamps null: false
播种示例:
@role_accounting_employee = Role.create( group: "accounting", function: "employee") # default company : "internal"
@role_accounting_employee.activities.deep_merge!({sheet: %w(show index) })