module Mongoid::Association::Referenced::CounterCache
Public Class Methods
define_callbacks!(association)
click to toggle source
Add the callbacks responsible for update the counter cache field.
@api private
@example Add the touchable.
Mongoid::Association::Referenced::CounterCache.define_callbacks!(association)
@param [ Association
] association The association.
@return [ Class ] The association’s owning class.
@since 7.0
# File lib/mongoid/association/referenced/counter_cache.rb, line 107 def self.define_callbacks!(association) name = association.name cache_column = association.counter_cache_column_name.to_sym association.inverse_class.tap do |klass| klass.after_update do if record = __send__(name) foreign_key = association.foreign_key if attribute_changed?(foreign_key) original, current = attribute_change(foreign_key) unless original.nil? record.class.with(persistence_context) do |_class| _class.decrement_counter(cache_column, original) end end unless current.nil? record[cache_column] = (record[cache_column] || 0) + 1 record.class.with(record.persistence_context) do |_class| _class.increment_counter(cache_column, current) if record.persisted? end end end end end klass.after_create do if record = __send__(name) record[cache_column] = (record[cache_column] || 0) + 1 if record.persisted? record.class.with(record.persistence_context) do |_class| _class.increment_counter(cache_column, record._id) end record.remove_change(cache_column) end end end klass.before_destroy do if record = __send__(name) record[cache_column] = (record[cache_column] || 0) - 1 unless record.frozen? if record.persisted? record.class.with(record.persistence_context) do |_class| _class.decrement_counter(cache_column, record._id) end record.remove_change(cache_column) end end end end end
Public Instance Methods
reset_counters(*counters)
click to toggle source
Reset the given counter using the .count() query from the db. This method is usuful in case that a counter got corrupted, or a new counter was added to the collection.
@example Reset the given counter cache
post.reset_counters(:comments)
@param [ Symbol, Array ] counters One
or more counter caches to reset
@since 4.0.0
# File lib/mongoid/association/referenced/counter_cache.rb, line 20 def reset_counters(*counters) self.class.with(persistence_context) do |_class| _class.reset_counters(self, *counters) end end