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
# 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) unless defined?(User::ROLES)
  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)
        self[:roles] = case v.class.to_s
                       when "String", "Symbol"
                         v
                       when "Array"
                         v.first
                       end
      end
    end

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

    def role
      roles.first
    end
  end
end