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
|
# File 'lib/active_record/aggregations/has_enumerated.rb', line 13
def has_enumerated(part_id, options = {})
options.assert_valid_keys(:class_name, :foreign_key, :on_lookup_failure)
name = part_id.id2name
class_name = (options[:class_name] || name).to_s.camelize
foreign_key = (options[:foreign_key] || "#{name}_id").to_s
failure = options[:on_lookup_failure]
module_eval <<-end_eval
def #{name}
rval = #{class_name}.lookup_id(self.#{foreign_key})
if rval.nil? && #{!failure.nil?}
return self.send(#{failure.inspect}, :read, #{name.inspect}, #{foreign_key.inspect}, #{class_name.inspect}, self.#{foreign_key})
end
return rval
end
def #{name}=(arg)
case arg
when #{class_name}
val = #{class_name}.lookup_id(arg.id)
when String
val = #{class_name}.lookup_name(arg)
when Symbol
val = #{class_name}.lookup_name(arg.id2name)
when Fixnum
val = #{class_name}.lookup_id(arg)
when nil
val = nil
else
raise TypeError, "#{self.name}: #{name}= argument must be a #{class_name}, String, Symbol or Fixnum but got a: \#{arg.class.name}"
end
if val.nil?
if #{failure.nil?}
raise ArgumentError, "#{self.name}: #{name}= can't assign a #{class_name} for a value of (\#{arg.inspect})"
end
self.send(#{failure.inspect}, :write, #{name.inspect}, #{foreign_key.inspect}, #{class_name.inspect}, arg)
else
self.#{foreign_key} = val.id
end
end
end_eval
end
|