为什么在使用触摸时不会触发after_save?

时间:2015-01-24 04:44:37

标签: ruby-on-rails ruby caching ruby-on-rails-4

最近几天,我试图使用Redis商店缓存rails app。 我有两个模型:

class Category < ActiveRecord::Base
  has_many :products

  after_save :clear_redis_cache

  private

    def clear_redis_cache
      puts "heelllooooo"
      $redis.del 'products'
    end
end

class Product < ActiveRecord::Base
  belongs_to :category, touch: true
end
控制器中的

def index
    @products = $redis.get('products')

    if @products.nil?
      @products = Product.joins(:category).pluck("products.id", "products.name", "categories.name")
      $redis.set('products', @products)
      $redis.expire('products', 3.hour.to_i)
    end

    @products = JSON.load(@products) if @products.is_a?(String)

  end

使用此代码,缓存工作正常。 但是当我更新或创建新产品(我在关系中使用了触摸方法)时,它不会触发Category模型中的after_save回调。 你能解释一下为什么吗?

3 个答案:

答案 0 :(得分:26)

您是否阅读过touch方法的文档?

  

使用设置为当前的updated_at / on属性保存记录   时间。 请注意,不会执行任何验证,只会执行验证   after_touch,after_commit和after_rollback回调被执行。   如果传递了属性名称,则会同时更新该属性   updated_at / on attributes。

答案 1 :(得分:6)

如果您希望在某些型号上调用after_save时执行touch次回调,则可以添加

after_touch :save

到这个模型。

答案 2 :(得分:1)

如果将:touch选项设置为:true,则只要此对象已保存已销毁,相关对象上的updated_at或updated_on时间戳将设置为当前时间 这个文件: http://guides.rubyonrails.org/association_basics.html#touch