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
|
# File 'lib/associations/associations.rb', line 51
def belongs_to_active_hash(association_id, options = {})
options = {
:class_name => association_id.to_s.camelize,
:foreign_key => association_id.to_s.foreign_key,
:shortcuts => []
}.merge(options)
options[:primary_key] ||= options[:class_name].safe_constantize.primary_key
options[:shortcuts] = [options[:shortcuts]] unless options[:shortcuts].kind_of?(Array)
define_method(association_id) do
options[:class_name].safe_constantize.send("find_by_#{options[:primary_key]}", send(options[:foreign_key]))
end
define_method("#{association_id}=") do |new_value|
send "#{options[:foreign_key]}=", new_value ? new_value.send(options[:primary_key]) : nil
end
options[:shortcuts].each do |shortcut|
define_method("#{association_id}_#{shortcut}") do
send(association_id).try(shortcut)
end
define_method("#{association_id}_#{shortcut}=") do |new_value|
send "#{association_id}=", new_value ? options[:class_name].safe_constantize.send("find_by_#{shortcut}", new_value) : nil
end
end
if ActiveRecord::Reflection.respond_to?(:create)
if defined?(ActiveHash::Reflection::BelongsToReflection)
reflection = ActiveHash::Reflection::BelongsToReflection.new(association_id.to_sym, nil, options, self)
else
reflection = ActiveRecord::Reflection.create(
:belongs_to,
association_id.to_sym,
nil,
options,
self
)
end
ActiveRecord::Reflection.add_reflection(
self,
association_id.to_sym,
reflection
)
else
method = ActiveRecord::Base.method(:create_reflection)
if method.respond_to?(:parameters) && method.parameters.length == 5
create_reflection(
:belongs_to,
association_id.to_sym,
nil,
options,
self
)
else
create_reflection(
:belongs_to,
association_id.to_sym,
options,
options[:class_name].safe_constantize
)
end
end
end
|