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 " def \#{name}\n rval = \#{class_name}.lookup_id(self.\#{foreign_key})\n if rval.nil? && \#{!failure.nil?}\n return self.send(\#{failure.inspect}, :read, \#{name.inspect}, \#{foreign_key.inspect}, \#{class_name.inspect}, self.\#{foreign_key})\n end\n return rval\n end\n\n def \#{name}=(arg)\n case arg\n when \#{class_name}\n val = \#{class_name}.lookup_id(arg.id)\n when String\n val = \#{class_name}.lookup_name(arg)\n when Symbol\n val = \#{class_name}.lookup_name(arg.id2name)\n when Fixnum\n val = \#{class_name}.lookup_id(arg)\n when nil\n val = nil\n else\n raise TypeError, \"\#{self.name}: \#{name}= argument must be a \#{class_name}, String, Symbol or Fixnum but got a: \\\#{arg.class.name}\"\n end\n\n if val.nil?\n if \#{failure.nil?}\n raise ArgumentError, \"\#{self.name}: \#{name}= can't assign a \#{class_name} for a value of (\\\#{arg.inspect})\"\n end\n self.send(\#{failure.inspect}, :write, \#{name.inspect}, \#{foreign_key.inspect}, \#{class_name.inspect}, arg)\n else\n self.\#{foreign_key} = val.id\n end\n end\n end_eval\nend\n"
|