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
|
# File 'lib/spiderfw/model/mixins/synchronized.rb', line 15
def synchronizing(name=nil)
return @synchronizing unless name
@synchronizing = name
with_mapper do
def before_save(obj, mode)
return super unless @model.synchronizing
obj = get_synchronized(obj)
super(obj, mode)
end
def get_synchronized(obj)
@model.elements_array.select{ |el|
obj.element_has_value?(el) && obj.model.mapper.have_references?(el) &&
el.model? && el.model.is_a?(Synchronized) && el.model.synchronizing == @model.synchronizing
}.each do |el|
el_objects = obj.get(el)
el_objects = [el_objects] unless (el_objects.is_a?(Enumerable))
new_el_objects = []
el_objects.each do |el_object|
cond = Condition.new
el.model.primary_keys.each do |k|
cond[el.model.synchronization_key(@model.synchronizing, k)] = el_object.get(k)
end
res = el.model.find(cond)
raise SynchronizationException, "The synchronized object was not unique" if res.length > 1
if (res.length == 1)
el.model.primary_keys.each do |k|
new_el_objects << res[0]
end
end
end
if !el.multiple?
obj.set(el, new_el_objects[0])
else
obj.set(el, new_el_objects)
end
end
@model.primary_keys.each do |k|
if (k.autogenerated? && !k.attributes[:no_sync_map])
obj.set(@model.synchronization_key(@model.synchronizing, k), obj.get(k))
obj.set(k.name, nil)
end
end
return obj
end
end
end
|