counter cache support
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user