counter cache support

This commit is contained in:
Dylan Knutson
2025-07-20 17:56:08 +00:00
parent 198ab946d7
commit 8854dddb4a
4 changed files with 172 additions and 82 deletions

View File

@@ -58,6 +58,7 @@ module HasAuxTable
setup_relation_extensions!(config)
setup_attribute_getter_setter_hooks!(config)
setup_enum_hook!(config)
setup_update_counter_hook!(config)
config
end
@@ -236,7 +237,6 @@ module HasAuxTable
read_attribute
_write_attribute
write_attribute
_assign_attribute
].each do |method_name|
method = self.instance_method(method_name)
self.define_method(method_name) do |name, *args, **kwargs, &block|
@@ -413,6 +413,31 @@ module HasAuxTable
end
end
end
sig { params(config: AuxTableConfig).void }
def setup_update_counter_hook!(config)
self.define_singleton_method(:update_counters) do |id, counters|
T.bind(self, T.class_of(ActiveRecord::Base))
main_counters = {}
aux_counters = {}
opts = {}
counters.each do |k, v|
is_aux = config.aux.is_column?(k)
is_main = config.main.is_column?(k)
if !is_aux && !is_main
opts[k] = v
elsif is_aux
aux_counters[k] = v
elsif is_main
main_counters[k] = v
end
end
super(id, main_counters.merge(opts)) if main_counters.any?
if aux_counters.any?
config.aux.klass.update_counters(id, aux_counters.merge(opts))
end
end
end
end
mixes_in_class_methods(ClassMethods)
end