12
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
|
# File 'lib/active_record/turntable/active_record_ext/clever_load.rb', line 12
def clever_load!(association_name)
records = self.to_a
klass = records.first.class
association_key = association_name.to_s
reflection = klass.reflections[association_key]
if reflection
foreign_class = reflection.klass
foreign_objects = case reflection.macro
when :has_one
foreign_class.where(reflection.foreign_key => records.map(&reflection.association_primary_key.to_sym).uniq)
when :belongs_to
foreign_class.where(reflection.association_primary_key => records.map(&reflection.foreign_key.to_sym).uniq)
else
[]
end
self.each do |obj|
matched_object = case reflection.macro
when :has_one
foreign_objects.find { |fo|
obj.send(reflection.association_primary_key) == fo.send(reflection.foreign_key)
}
when :belongs_to
foreign_objects.find { |fo|
obj.send(reflection.foreign_key) == fo.send(reflection.association_primary_key)
}
end
obj.association(association_name).target = matched_object
obj.association(association_name).set_inverse_instance(matched_object) if matched_object
obj.association(association_name).loaded!
end
end
records
end
|