module RoleModel::ClassMethods

Public Instance Methods

mask_for(*roles) click to toggle source
# File lib/role_model/class_methods.rb, line 21
def mask_for(*roles)
  sanitized_roles = roles.map { |role| Array(role) }.flatten.map(&:to_sym)

  (valid_roles & sanitized_roles).inject(0) { |sum, role| sum + 2**valid_roles.index(role) }
end
roles_attribute(name) click to toggle source

set the bitmask attribute role assignments will be stored in

# File lib/role_model/class_methods.rb, line 12
def roles_attribute(name)
  self.roles_attribute = name
end
roles_attribute=(name) click to toggle source

alternative method signature: set the bitmask attribute role assignments will be stored in

# File lib/role_model/class_methods.rb, line 17
def roles_attribute=(name)
  self.roles_attribute_name = name.to_sym
end
roles_from_mask(mask) click to toggle source
# File lib/role_model/class_methods.rb, line 27
def roles_from_mask(mask)
  valid_roles.reject { |role| (mask.to_i & 2**valid_roles.index(role)).zero? }
end

Protected Instance Methods

define_dynamic_queries(roles) click to toggle source

Defines dynamic queries for :role

#is_<:role>?
#<:role>?

Defines new methods which call is?(:role)

# File lib/role_model/class_methods.rb, line 53
def define_dynamic_queries(roles)
  dynamic_module = Module.new do
    roles.each do |role|
      ["#{role}?".to_sym, "is_#{role}?".to_sym].each do |method|
        define_method(method) { is? role }
      end
    end
  end
  include dynamic_module
end
roles(:role_1, ..., :role_n) click to toggle source
roles('role_1', ..., 'role_n')
roles([:role_1, ..., :role_n])
roles(['role_1', ..., 'role_n'])

declare valid roles

# File lib/role_model/class_methods.rb, line 40
def roles(*roles)
  opts = roles.last.is_a?(Hash) ? roles.pop : {}
  self.valid_roles = roles.flatten.map(&:to_sym)
  unless (opts[:dynamic] == false)
    self.define_dynamic_queries(self.valid_roles)
  end
end