我有场地和场地管理员,有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