@@ -4,7 +4,7 @@ module Attributes
4
4
module Builder
5
5
class Enum
6
6
7
- attr_accessor :klass , :attribute , :subtype , :options , :values
7
+ attr_accessor :klass , :attribute , :subtype , :options , :values , :enum_module
8
8
9
9
# Start a new builder of methods for composite values on
10
10
# ActiveRecord::Base
@@ -74,9 +74,14 @@ def conflicting?
74
74
75
75
# Create all methods needed
76
76
def build
77
+ @enum_module = Module . new
78
+
77
79
plural
78
80
text
79
81
all_values
82
+
83
+ klass . include enum_module
84
+ klass . extend enum_module ::ClassMethods
80
85
end
81
86
82
87
private
@@ -98,7 +103,8 @@ def dangerous?(method_name, class_method = false)
98
103
def plural
99
104
attr = attribute
100
105
enum_klass = subtype . klass
101
- klass . singleton_class . module_eval do
106
+ enum_module . const_set ( 'ClassMethods' , Module . new )
107
+ enum_module ::ClassMethods . module_eval do
102
108
# def self.statuses() statuses end
103
109
define_method ( attr . pluralize ) do
104
110
enum_klass . values
@@ -113,7 +119,7 @@ def plural
113
119
114
120
# def self.statuses_options() statuses_texts.zip(statuses) end
115
121
define_method ( attr . pluralize + '_options' ) do
116
- enum_klass . values
122
+ public_send ( attr . pluralize + '_texts' ) . zip ( enum_klass . values )
117
123
end
118
124
end
119
125
end
@@ -122,7 +128,7 @@ def plural
122
128
# the model scope
123
129
def text
124
130
attr = attribute
125
- klass . module_eval do
131
+ enum_module . module_eval do
126
132
# def status_text() status.text('status', self) end
127
133
define_method ( "#{ attr } _text" ) { send ( attr ) . text ( attr , self ) }
128
134
end
@@ -133,10 +139,11 @@ def text
133
139
def all_values
134
140
attr = attribute
135
141
vals = values_methods
136
- klass . module_eval do
142
+ model_klass = klass
143
+ enum_module . module_eval do
137
144
vals . each do |val , list |
138
145
# scope :disabled, -> { where(status: 'disabled') }
139
- scope list [ 0 ] , -> { where ( attr => val ) }
146
+ model_klass . scope list [ 0 ] , -> { where ( attr => val ) }
140
147
141
148
# def disabled? status.disabled? end
142
149
define_method ( list [ 1 ] ) { send ( attr ) . public_send ( "#{ val } ?" ) }
0 commit comments