module RolesField::Base::ClassMethods

Public Instance Methods

roles_field(field, options={}) click to toggle source
# File lib/roles-field.rb, line 11
def roles_field(field, options={})
  roles = options[:roles]

  class_eval %(
    def roles=(roles)
      self.#{field} = (#{roles} & roles).map { |role| 
        2 ** #{roles}.index(role.to_sym)
      }.sum
    end

    def roles
      #{roles}.reject { |role| 
        ((#{field} || 0) & 2 ** #{roles}.index(role.to_sym)).zero?
      }
    end

    def role?(role)
      roles.include? role.to_sym
    end

    def role=(role)
      self.roles = (#{roles} & [role.to_sym])
    end

    def set_role(role)
      self.role = role
    end

    scope :with_role, lambda { |role| 
      {
        :conditions => ['#{field} & ? > 0', 2 ** #{roles}.index(role.to_sym)]
      }
    }
  )

  roles.each do |role|
    define_method "is_#{role}?" do
      role? role
    end
  end
end