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
48
49
50
51
52
53
54
55
56
57
58
59
|
# File 'activerecord/lib/active_record/associations/has_many_association.rb', line 14
def handle_dependency
case options[:dependent]
when :restrict_with_exception
raise ActiveRecord::DeleteRestrictionError.new(reflection.name) unless empty?
when :restrict_with_error
unless empty?
record = owner.class.human_attribute_name(reflection.name).downcase
owner.errors.add(:base, :'restrict_dependent_destroy.has_many', record: record)
throw(:abort)
end
when :destroy
load_target.each { |t| t.destroyed_by_association = reflection }
destroy_all
when :destroy_async
load_target.each do |t|
t.destroyed_by_association = reflection
end
unless target.empty?
association_class = target.first.class
if association_class.query_constraints_list
primary_key_column = association_class.query_constraints_list
ids = target.collect { |assoc| primary_key_column.map { |col| assoc.public_send(col) } }
else
primary_key_column = association_class.primary_key
ids = target.collect { |assoc| assoc.public_send(primary_key_column) }
end
ids.each_slice(owner.class.destroy_association_async_batch_size || ids.size) do |ids_batch|
enqueue_destroy_association(
owner_model_name: owner.class.to_s,
owner_id: owner.id,
association_class: reflection.klass.to_s,
association_ids: ids_batch,
association_primary_key_column: primary_key_column,
ensuring_owner_was_method: options.fetch(:ensuring_owner_was, nil)
)
end
end
else
delete_all
end
end
|