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
69
70
|
# File 'lib/composite_primary_keys/associations/has_many_association.rb', line 25
def delete_records(records)
case @reflection.options[:dependent]
when :destroy
records.each { |r| r.destroy }
when :delete_all
@reflection.klass.delete(records.map { |record| record.id })
else
relation = Arel::Table.new(@reflection.table_name)
id_predicate = nil
owner_key_values = @reflection.cpk_primary_key.zip([@owner.id].flatten)
owner_key_values.each do |key, value|
eq = relation[key].eq(value)
id_predicate = id_predicate ? id_predicate.and(eq) : eq
end
record_predicates = nil
records.each do |record|
keys = [@reflection.klass.primary_key].flatten
values = [record.id].flatten
record_predicate = nil
keys.zip(values).each do |key, value|
eq = relation[key].eq(value)
record_predicate = record_predicate ? record_predicate.and(eq) : eq
end
record_predicates = record_predicates ? record_predicates.or(record_predicate) : record_predicate
end
relation = relation.where(id_predicate.and(record_predicates))
nullify_relation = Arel::Table.new(@reflection.table_name)
nullify = @reflection.cpk_primary_key.inject(Hash.new) do |hash, key|
hash[nullify_relation[key]] = nil
hash
end
relation.update(nullify)
@owner.class.update_counters(@owner.id, cached_counter_attribute_name => -records.size) if has_cached_counter?
end
end
|