5
6
7
8
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
|
# File 'lib/active_record/enum_override.rb', line 5
def sql_enum(name, options={})
enum_prefix = options.delete(:_prefix)
enum_suffix = options.delete(:_suffix)
enum_prefix ||= name if SqlEnum.configuration.default_prefix
enum_suffix ||= name if SqlEnum.configuration.default_suffix
klass = self
enum_values = Array.new
name = name.to_sym
detect_enum_conflict!(name, name.to_s.pluralize, true)
klass.singleton_class.send(:define_method, name.to_s.pluralize) { enum_values.map(&:to_sym) }
detect_enum_conflict!(name, name)
detect_enum_conflict!(name, "#{name}=")
attr = attribute_alias?(name) ? attribute_alias(name) : name
decorate_attribute_type(attr, :enum) do |subtype|
EnumType.new(attr, enum_values, subtype)
end
enum_values = values(name)
enum_values.each do |value|
if enum_prefix == true
prefix = "#{name}_"
elsif enum_prefix
prefix = "#{enum_prefix}_"
end
if enum_suffix == true
suffix = "_#{name}"
elsif enum_suffix
suffix = "_#{enum_suffix}"
end
value_method_name = "#{prefix}#{value}#{suffix}"
klass.send(:detect_enum_conflict!, name, "#{value_method_name}?")
define_method("#{value_method_name}?") { self[attr] == value.to_s }
klass.send(:detect_enum_conflict!, name, "#{value_method_name}!")
define_method("#{value_method_name}!") { update!(attr => value) }
klass.send(:detect_enum_conflict!, name, value_method_name, true)
klass.scope value_method_name, -> { where(attr => value) }
end
defined_enums[name.to_s] = enum_values
end
|