Module: Mongoid::Relations::CounterCache::ClassMethods

Defined in:
build/mongoid-6.1/lib/mongoid/relations/counter_cache.rb

Instance Method Summary collapse

Instance Method Details

#decrement_counter(counter_name, id) ⇒ Object

Decrement the counter name from the entries that match the id by one. This method is used on associations callbacks when counter_cache is enabled

Examples:

Decrement comments counter

Post.decrement_counter(:comments_count, '50e0edd97c71c17ea9000001')

Parameters:

  • counter_name (Symbol)

    Counter cache name

  • id (String)

    The id of the object that will have its counter decremented.

Since:

  • 3.1.0



88
89
90
# File 'build/mongoid-6.1/lib/mongoid/relations/counter_cache.rb', line 88

def decrement_counter(counter_name, id)
  update_counters(id, counter_name.to_sym => -1)
end

#increment_counter(counter_name, id) ⇒ Object

Increment the counter name from the entries that match the id by one. This method is used on associations callbacks when counter_cache is enabled

Examples:

Increment comments counter

Post.increment_counter(:comments_count, '50e0edd97c71c17ea9000001')

Parameters:

  • counter_name (Symbol)

    Counter cache name

  • id (String)

    The id of the object that will have its counter incremented.

Since:

  • 3.1.0



73
74
75
# File 'build/mongoid-6.1/lib/mongoid/relations/counter_cache.rb', line 73

def increment_counter(counter_name, id)
  update_counters(id, counter_name.to_sym => 1)
end

#reset_counters(id, *counters) ⇒ Object

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.

Examples:

Reset the given counter cache

Post.reset_counters('50e0edd97c71c17ea9000001', :comments)

Parameters:

  • id (String)

    The id of the object that will be reset.

  • counters (Symbol, Array)

    One or more counter caches to reset

Since:

  • 3.1.0



36
37
38
39
40
41
42
43
44
# File 'build/mongoid-6.1/lib/mongoid/relations/counter_cache.rb', line 36

def reset_counters(id, *counters)
  document = id.is_a?(Document) ? id : find(id)
  counters.each do |name|
    meta = reflect_on_association(name)
    inverse = meta.klass.reflect_on_association(meta.inverse)
    counter_name = inverse.counter_cache_column_name
    document.update_attribute(counter_name, document.send(name).count)
  end
end

#update_counters(id, counters) ⇒ Object

Update the given counters by the value factor. It uses the atomic $inc command.

Examples:

Add 5 to comments counter and remove 2 from likes

counter.
Post.update_counters('50e0edd97c71c17ea9000001',
           :comments_count => 5, :likes_count => -2)

Parameters:

  • id (String)

    The id of the object to update.

  • counters (Hash)

Since:

  • 3.1.0



58
59
60
# File 'build/mongoid-6.1/lib/mongoid/relations/counter_cache.rb', line 58

def update_counters(id, counters)
  where(:_id => id).inc(counters)
end