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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
|
# File 'lib/code-box/code_attribute.rb', line 48
def code_attribute(*code_names)
options = code_names.
opts = DefaultOptions.merge(options)
lookup_type = opts.delete(:lookup_type)
code_attr_suffix = (opts.delete(:code_attribute_suffix) || "code").to_s
foreign_code_attr_name = opts.delete(:foreign_code_attribute)
code_names.each do |code_name|
opts_copy = opts.dup
code_attr_name = (opts_copy.delete(:attribute_name) || "#{code_name}_#{code_attr_suffix}").to_s
code_class_name = opts_copy.delete(:class_name) || "::Codes::#{code_name.to_s.camelize}"
case lookup_type
when :lookup
class_eval <<-RUBY_
# getter
def #{code_name}
#{code_class_name}.for_code(#{code_attr_name})
end
# setter
def #{code_name}=(code)
value = code.#{foreign_code_attr_name}
#{code_attr_name} = value
end
RUBY_
when :associated
association_options = opts_copy.merge({
:class_name => "#{code_class_name}",
:foreign_key => "#{code_attr_name}".to_sym,
:primary_key => "#{foreign_code_attr_name}"
})
belongs_to "#{code_name}".to_sym, association_options
when :i18n
class_eval <<-RUBY_
# getter
def #{code_name}(locale=I18n.locale)
code = self.#{code_attr_name}
self.class.translate_#{code_attr_name}(code, :locale => locale)
end
# setter
def #{code_name}=(code)
raise "#{code_name} is a i18n code and can not be set. Use the the correct method '#{code_attr_name}='' instead."
end
# translator
class << self
def translate_#{code_attr_name}(*code)
options = code.extract_options!
locale = options[:locale] || I18n.locale
codes = code.first
is_paramter_array = codes.kind_of? Array
codes = Array(codes)
translated_codes = codes.map { |code|
code_key = code.nil? ? :null_value : code
I18n.t("\#{self._code_box_i18n_model_segment}.values.\#{self.name.underscore}.#{code_attr_name}.\#{code_key}", :locale => locale)
}
if options[:build] == :zip
translated_codes.zip(codes)
else
is_paramter_array ? translated_codes : translated_codes.first
end
end
end
RUBY_
else
raise ArgumentError, "'#{lookup_type}' is not valid. Must be one of [:code_cache, :association]"
end
end
end
|