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
|
# File 'lib/knitsearch/has_many_dependent.rb', line 18
def knitsearch_refresh_has_many_parents
dependents = Knitsearch.has_many_dependents[self.class]
return unless dependents
dependents.each do |dependent|
parent_class = dependent[:parent]
inverse_fk_sym = dependent[:inverse_fk]
shadow_map = dependent[:columns]
parent_assoc = dependent[:parent_assoc]
parents_to_update = []
current_fk_value = read_attribute(inverse_fk_sym)
if current_fk_value.present?
parents_to_update << current_fk_value
end
if saved_change_to_attribute?(inverse_fk_sym)
old_fk_value = saved_changes[inverse_fk_sym]&.first
if old_fk_value.present?
parents_to_update << old_fk_value
end
end
parents_to_update.uniq.each do |parent_id|
parent = parent_class.find_by(id: parent_id)
next unless parent
updates = {}
shadow_map.each do |shadow_col, source_col|
values = parent.send(parent_assoc).pluck(source_col).compact.map(&:to_s)
updates[shadow_col] = values.any? ? values.join(" ") : nil
end
parent.update_columns(updates)
end
end
end
|