Skip to content

Commit

Permalink
Merge pull request #43297 from jhawthorn/avoid_callback_class_attrs
Browse files Browse the repository at this point in the history
Avoid class_attrs for unused collection callbacks
  • Loading branch information
jhawthorn committed Sep 24, 2021
2 parents 1268b9a + bfcac13 commit 0143476
Show file tree
Hide file tree
Showing 2 changed files with 14 additions and 3 deletions.
Expand Up @@ -30,11 +30,18 @@ def self.define_extensions(model, name, &block)
def self.define_callback(model, callback_name, name, options)
full_callback_name = "#{callback_name}_for_#{name}"

unless model.method_defined?(full_callback_name)
callback_values = Array(options[callback_name.to_sym])
method_defined = model.respond_to?(full_callback_name)

# If there are no callbacks, we must also check if a superclass had
# previously defined this association
return if callback_values.empty? && !method_defined

unless method_defined
model.class_attribute(full_callback_name, instance_accessor: false, instance_predicate: false)
end

callbacks = Array(options[callback_name.to_sym]).map do |callback|
callbacks = callback_values.map do |callback|
case callback
when Symbol
->(method, owner, record) { owner.send(callback, record) }
Expand Down
Expand Up @@ -480,7 +480,11 @@ def callback(method, record)

def callbacks_for(callback_name)
full_callback_name = "#{callback_name}_for_#{reflection.name}"
owner.class.send(full_callback_name)
if owner.class.respond_to?(full_callback_name)
owner.class.send(full_callback_name)
else
[]
end
end

def include_in_memory?(record)
Expand Down

0 comments on commit 0143476

Please sign in to comment.