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
57
58
59
60
61
62
63
64
65
66
67
68
|
# File 'lib/foreign_model.rb', line 14
def belongs_to_foreign_model(name, options={})
options[:class_name] ||= ForeignModel.camelize(name.to_s)
ForeignModel::SCOPE_PROCS[self][name.to_s] = begin
if options[:scope]
options[:scope]
elsif options[:polymorphic]
proc do |r|
type = r.send("#{name}_type")
type and eval(type)
end
else
proc{ eval(options[:class_name]) }
end
end
class_eval %`
def parent_proc_for_#{name}
@parent_proc_for_#{name} ||= begin
ForeignModel::SCOPE_PROCS[self.class]["#{name}"].call(self)
end
end
def #{name}
@#{name} ||= parent_proc_for_#{name}.find(#{name}_id) if parent_proc_for_#{name} && #{name}_id
end
def #{name}=(foreign_model)
@#{name} = foreign_model
if foreign_model
send('#{name}_id=', foreign_model.id)
send('#{name}_type=', foreign_model.class.name) if respond_to? '#{name}_type='
end
end
def #{name}_id=(foreign_model_id)
if #{name}_id != foreign_model_id
write_raw_attribute("#{name}_id", foreign_model_id)
@#{name} = nil
end
end
`
if options[:polymorphic]
class_eval %`
def #{name}_type=(foreign_model_type)
if #{name}_type != foreign_model_type
write_raw_attribute("#{name}_type", foreign_model_type)
@#{name} = nil
end
end
`
end
end
|