Skip to content

Commit 0143476

Browse files
authored
Merge pull request rails#43297 from jhawthorn/avoid_callback_class_attrs
Avoid class_attrs for unused collection callbacks
2 parents 1268b9a + bfcac13 commit 0143476

File tree

2 files changed

+14
-3
lines changed

2 files changed

+14
-3
lines changed

activerecord/lib/active_record/associations/builder/collection_association.rb

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,11 +30,18 @@ def self.define_extensions(model, name, &block)
3030
def self.define_callback(model, callback_name, name, options)
3131
full_callback_name = "#{callback_name}_for_#{name}"
3232

33-
unless model.method_defined?(full_callback_name)
33+
callback_values = Array(options[callback_name.to_sym])
34+
method_defined = model.respond_to?(full_callback_name)
35+
36+
# If there are no callbacks, we must also check if a superclass had
37+
# previously defined this association
38+
return if callback_values.empty? && !method_defined
39+
40+
unless method_defined
3441
model.class_attribute(full_callback_name, instance_accessor: false, instance_predicate: false)
3542
end
3643

37-
callbacks = Array(options[callback_name.to_sym]).map do |callback|
44+
callbacks = callback_values.map do |callback|
3845
case callback
3946
when Symbol
4047
->(method, owner, record) { owner.send(callback, record) }

activerecord/lib/active_record/associations/collection_association.rb

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -480,7 +480,11 @@ def callback(method, record)
480480

481481
def callbacks_for(callback_name)
482482
full_callback_name = "#{callback_name}_for_#{reflection.name}"
483-
owner.class.send(full_callback_name)
483+
if owner.class.respond_to?(full_callback_name)
484+
owner.class.send(full_callback_name)
485+
else
486+
[]
487+
end
484488
end
485489

486490
def include_in_memory?(record)

0 commit comments

Comments
 (0)