如何使用acts_as_taggable_on缓存标记?

时间:2010-10-15 23:08:18

标签: ruby-on-rails caching acts-as-taggable-on

我有带标签上下文的模型:

class Product < ActiveRecord::Base
  acts_as_taggable_on :categories
end

我正在尝试初始化标签缓存:

class AddCachedCategoryListToProducts < ActiveRecord::Migration
  def self.up
    add_column :products,  :cached_category_list, :string
    Product.reset_column_information
    products = Product.all
    products.each { |p| p.save_cached_tag_list }
  end
end

但是cached_category_list没有初始化。我做错了什么?有没有人可以使用这个gem的缓存(我的版本是2.0.6)?

2 个答案:

答案 0 :(得分:15)

好吧,今天我遇到了同样的问题。 我终于解决了它,我的迁移缓存了所需的标签。 您的迁移问题有两个:

  1. 设置缓存的ActsAsTaggable代码需要在重置列信息后再次运行。否则,不会创建缓存方法(请参阅https://github.com/mbleigh/acts-as-taggable-on/blob/v2.0.6/lib/acts_as_taggable_on/acts_as_taggable_on/cache.rb

  2. 您正在调用的方法 save_cached_tag_list 不会自动保存记录,因为它是作为 before_save 挂钩安装的,并且它不需要创建一个无限循环。所以你必须打电话给保存。

  3. 因此,尝试使用以下内容替换您的迁移,它应该可以工作:

    class AddCachedCategoryListToProducts < ActiveRecord::Migration
      def self.up
        add_column :products,  :cached_category_list, :string
        Product.reset_column_information
        # next line makes ActsAsTaggableOn see the new column and create cache methods
        ActsAsTaggableOn::Taggable::Cache.included(Product)
        Product.find_each(:batch_size => 1000) do |p|
          p.category_list # it seems you need to do this first to generate the list
          p.save! # you were missing the save line!
        end    
      end
    end
    

    应该这样做。

答案 1 :(得分:-5)

如果您将其与自有标签结合使用,则可能是问题所在。 看一下gem的代码,看来自有标签的缓存不支持

希望这有帮助,

最佳, Ĵ