Rails ActiveRecord CounterCache и обратные вызовы

Вызывает ли инкременты и декременты counter_cache обратные вызовы active_record?

User << AR

  has_many :cups

  after_update :do_something

  def do_something
     "Will I be called when number of cups updated ?"
  end

end

Cup << AR

   belongs_to :user, counter_cache: true

end

В приведенном выше коде будет вызываться функция do_something, когда добавляется новая чашка, и она принадлежит пользователю, для этого пользователя будет вызываться обновление для обновления cups_count, но из того, что я пробовал, кажется, что обновления counter_cache не обратные вызовы огня, может быть, потому что они сами находятся внутри обратных вызовов?

Спасибо


person Abid    schedule 30.04.2013    source источник


Ответы (2)


Из источника кэша счетчиков кажется, что ActiveRecord выполнение прямого обновления базы данных, которое будет пропускать обратные вызовы.

update_all(updates.join(', '), primary_key => id )

Согласно документации для update_all, он пропускает обратные вызовы.

person davogones    schedule 30.04.2013

Как упоминает @davogones, использование обратных вызовов отключено, но вы все равно можете сделать что-то подобное, переопределив метод update_counters в своем родительском объекте.

В моем случае мне нужно было что-то сделать, если счетчик counter_cache превысил определенное значение:

class Cups < ApplicationRecord
  belongs_to :user, :counter_cache => true
end

class User < ApplicationRecord
  has_many :cups

  # This will be called every time there is a counter_cache update, + or - 
  def self.update_counters(id, counters)
    user = User.find(id)
    if user.cups_count + counters['cups_count'] >= some_value
      user.do_something!
    end
    super(id, counters) # continue on with the normal update_counters flow.
  end
end

Дополнительную информацию см. в документации по update_counters.

person Simon L. Brazell    schedule 01.02.2019