Handle alternative base classes in define_attribute_methods

Ref: d429bfb3b6 (r136670440)
This commit is contained in:
Jean Boussier 2024-01-11 09:29:56 +01:00
parent e59b779a24
commit 2cd568a5da
4 changed files with 23 additions and 15 deletions

@ -365,6 +365,8 @@ def inherited(base) # :nodoc:
super
base.class_eval do
@attribute_method_patterns_cache = nil
@aliases_by_attribute_name = nil
@generated_attribute_methods = nil
end
end

@ -115,27 +115,37 @@ def define_attribute_methods # :nodoc:
GeneratedAttributeMethods::LOCK.synchronize do
return false if @attribute_methods_generated
superclass.define_attribute_methods unless superclass == Base
superclass.define_attribute_methods unless base_class?
unless abstract_class?
load_schema
super(attribute_names)
end
ActiveSupport::CodeGenerator.batch(generated_attribute_methods, __FILE__, __LINE__) do |code_generator|
aliases_by_attribute_name.each do |old_name, new_names|
new_names.each do |new_name|
generate_alias_attribute_methods(code_generator, new_name, old_name)
end
end
alias_attribute :id_value, :id if _has_attribute?("id")
end
@attribute_methods_generated = true
@alias_attributes_mass_generated = true
generate_alias_attributes
end
true
end
def generate_alias_attributes # :nodoc:
superclass.generate_alias_attributes unless superclass == Base
return if @alias_attributes_mass_generated
ActiveSupport::CodeGenerator.batch(generated_attribute_methods, __FILE__, __LINE__) do |code_generator|
aliases_by_attribute_name.each do |old_name, new_names|
new_names.each do |new_name|
generate_alias_attribute_methods(code_generator, new_name, old_name)
end
end
end
@alias_attributes_mass_generated = true
end
def undefine_attribute_methods # :nodoc:
GeneratedAttributeMethods::LOCK.synchronize do
super if @attribute_methods_generated

@ -152,11 +152,6 @@ def inherited(base)
@attributes_builder = nil
end
end
def load_schema! # :nodoc:
super
alias_attribute :id_value, :id if @columns_hash.key?("id")
end
end
end
end

@ -37,6 +37,7 @@ def setup
self.table_name = "topics"
end
new_topic_model.define_attribute_methods
assert_includes new_topic_model.attribute_names, "id"
assert_includes new_topic_model.attribute_aliases, "id_value"
end