Module: Petergate::ActiveRecord::Base::ClassMethods

Defined in:
lib/petergate/active_record/base.rb

Instance Method Summary collapse

Instance Method Details

#petergate(roles: [:admin], multiple: true) ⇒ Object



9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
# 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