Rails after_remove没有被破坏触发

时间:2014-01-29 20:31:19

标签: ruby-on-rails activerecord

我有场地和场地管理员,有HABTM关系,我通过after_add和after_remove回调滚动我自己的计数器缓存。在场地管理者的那些回调将通过mixin添加到场地模型中。我正在使用mixin,因为还有其他模型需要相同的逻辑。

如果有2个venue_managers并且我将venue_managers重新分配给1,使用venue.venue_managers = a_user,则会触发after_remove回调并且一切正常。如果我有2个venue_managers并使用venue.venue_managers.last.destroy销毁最后一个,则不会触发after_remove回调并且计数器缓存不会更新,这是我的问题。

class Venue < ActiveRecord::Base
  include HABTMCounterCache

  has_and_belongs_to_many :venue_managers, :class_name => 'User', :join_table => :venues_venue_managers
end

module HABTMCounterCache
  extend ::ActiveSupport::Concern

  module ClassMethods
    def count_cache_associations
      klass = self.name.downcase
      self.send("after_add_for_#{klass}_managers") << lambda do |obj, manager|
        obj.update_counter_cache(manager)
      end

      self.send("after_remove_for_#{klass}_managers") << lambda do |obj, manager|
        obj.update_counter_cache(manager)
      end
    end
  end

  def update_counter_cache(noop)
    klass = self.class.name.downcase
    self.assign_attributes(:"#{klass}_managers_count" => self.send("#{klass}_managers").count)
  end
end

0 个答案:

没有答案