Как включить модуль с окончанием срока действия кэша в метлах? - PullRequest
4 голосов
/ 22 марта 2011

В приложении rails есть следующий очиститель:

class AgencyEquipmentTypeSweeper < ActionController::Caching::Sweeper 
  observe AgencyEquipmentType

  #include ExpireOptions
  def after_update(agency_equipment_type)
    expire_options(agency_equipment_type)
  end

  def after_delete(agency_equipment_type)
    expire_options(agency_equipment_type)
  end

  def after_create(agency_equipment_type)
    expire_options(agency_equipment_type)
  end

  def expire_options(agency_equipment_type)
    Rails.cache.delete("agency_equipment_type_options/#{agency_equipment_type.agency_id}")
  end
end

Мы хотели бы извлечь обратные вызовы after_update, after_delete и after_create в модуль с именем "ExpireOptions"

модуль должен выглядеть следующим образом (с сохранением метода expire_options в исходном очистителе):

module ExpireOptions
  def after_update(record)
    expire_options(record)
  end

  def after_delete(record)
    expire_options(record)
  end

  def after_create(record)
    expire_options(record)
  end
end

class AgencyEquipmentTypeSweeper < ActionController::Caching::Sweeper 
  observe AgencyEquipmentType

  include ExpireOptions

  def expire_options(agency_equipment_type)
    Rails.cache.delete("agency_equipment_type_options/#{agency_equipment_type.agency_id}")
  end
end

НО срок действия кэша работает только в том случае, если мы явно определяем методы внутри очистителя,Есть ли простой способ извлечь эти методы обратного вызова в модуль и при этом заставить их работать?

Ответы [ 2 ]

2 голосов
/ 29 мая 2011

Попробуйте с:

module ExpireOptions
  def self.included(base)
    base.class_eval do
      after_update :custom_after_update
      after_delete :custom_after_delete
      after_create :custom_after_create
    end
  end

  def custom_after_update(record)
    expire_options(record)
  end

  def custom_after_delete(record)
    expire_options(record)
  end

  def custom_after_create(record)
    expire_options(record)
  end
end
0 голосов
/ 31 мая 2011

Я бы попробовал что-то вроде:

module ExpireOptions
  def after_update(record)
    self.send(:expire_options, record)
  end

  def after_delete(record)
    self.send(:expire_options, record)
  end

  def after_create(record)
    self.send(:expire_options, record)
  end
end

Это должно убедиться, что он не пытается вызывать эти методы в модуле, а в self, который, мы надеемся, будет вызывающим объектом.

Это помогает?

...