CanCan:数据库中的能力

时间:2013-10-28 16:22:13

标签: ruby-on-rails authorization cancan

我想知道https://github.com/ryanb/cancan/wiki/Abilities-in-Database的两个第一个代码块的优点/缺点是什么:

def initialize(user)
  can do |action, subject_class, subject|
    user.permissions.find_all_by_action(aliases_for_action(action)).any? do |permission|
      permission.subject_class == subject_class.to_s &&
      (subject.nil? || permission.subject_id.nil? || permission.subject_id == subject.id)
    end
  end
end

def initialize(user)
  user.permissions.each do |permission|
    if permission.subject_id.nil?
      can permission.action.to_sym, permission.subject_class.constantize
    else
      can permission.action.to_sym, permission.subject_class.constantize, :id => permission.subject_id
    end
  end
end

对我而言似乎都很好......也许方法#1的表现不太好?方法#2可能不太灵活吗?

1 个答案:

答案 0 :(得分:0)

第一个将使用您正在检查的能力的参数查询数据库,它实际上不会定义任何权限。

第二种方法将遍历数据库的所有权限,为每个权限创建一个权限。

如果使用第二种方法,您可能希望确保只打一次DB(可能是在启动服务器时),因此您不必在每次加载页面时进行表扫描。