module Petergate::ActiveRecord::Base::ClassMethods

Public Instance Methods

available_roles() click to toggle source
# File lib/petergate/active_record/base.rb, line 36
def available_roles
  self.class::ROLES
end
has_roles?(*roles) click to toggle source
# File lib/petergate/active_record/base.rb, line 73
def has_roles?(*roles)
  (roles & self.roles).any?
end
petergate(roles: [:admin], multiple: true) click to toggle source
# File lib/petergate/active_record/base.rb, line 9
def petergate(roles: [:admin], multiple: true)
  if multiple
    serialize :roles
    after_initialize do
      self[:roles] ||= [:user]
    end
  else
    after_initialize do
      self[:roles] ||= :user 
    end
  end

  instance_eval do
    const_set('ROLES', (roles + [:user]).uniq.map(&:to_sym)) unless defined?(User::ROLES)

    if multiple
      roles.each do |role|
        define_singleton_method("role_#{role.to_s.pluralize}".downcase.to_sym){self.where("roles LIKE '%- :#{role}\n%'")}
      end
    else
      roles.each do |role|
        define_singleton_method("role_#{role.to_s.pluralize}".downcase.to_sym){self.where(roles: role)}
      end
    end
  end

  class_eval do
    def available_roles
      self.class::ROLES
    end

    if multiple
      def roles=(v)
        self[:roles] = (Array(v).map(&:to_sym).select{|r| r.size > 0 && available_roles.include?(r)} + [:user]).uniq
      end
    else
      def roles=(v)
        r = case v.class.to_s
            when "String", "Symbol"
              v
            when "Array"
              v.first
            end.to_sym
        self[:roles] = available_roles.include?(r) ? r : :user 
      end
    end

    def roles
      case self[:roles].class.to_s
      when "String", "Symbol"
        [self[:roles].to_sym, :user].uniq
      when "Array"
        super
      else
        [:user]
      end
    end

    alias_method :role=, :roles=

    def role
      roles.first
    end

    def has_roles?(*roles)
      (roles & self.roles).any?
    end

    alias_method :has_role?, :has_roles?
  end
end
role() click to toggle source
# File lib/petergate/active_record/base.rb, line 69
def role
  roles.first
end
roles() click to toggle source
Calls superclass method
# File lib/petergate/active_record/base.rb, line 56
def roles
  case self[:roles].class.to_s
  when "String", "Symbol"
    [self[:roles].to_sym, :user].uniq
  when "Array"
    super
  else
    [:user]
  end
end
roles=(v) click to toggle source
# File lib/petergate/active_record/base.rb, line 41
def roles=(v)
  self[:roles] = (Array(v).map(&:to_sym).select{|r| r.size > 0 && available_roles.include?(r)} + [:user]).uniq
end