mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
Merge pull request #43297 from jhawthorn/avoid_callback_class_attrs
Avoid class_attrs for unused collection callbacks
This commit is contained in:
commit
014347620d
2 changed files with 14 additions and 3 deletions
|
@ -30,11 +30,18 @@ module ActiveRecord::Associations::Builder # :nodoc:
|
|||
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) }
|
||||
|
|
|
@ -480,7 +480,11 @@ module ActiveRecord
|
|||
|
||||
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)
|
||||
|
|
Loading…
Reference in a new issue