Ruby on rails 如何使用acts_as_taggable_来缓存标记?

Ruby on rails 如何使用acts_as_taggable_来缓存标记?,ruby-on-rails,caching,acts-as-taggable-on,Ruby On Rails,Caching,Acts As Taggable On,我有一个带有标记上下文的模型: class Product < ActiveRecord::Base acts_as_taggable_on :categories end 类产品

我有一个带有标记上下文的模型:

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
class AddCachedCategoryListProducts

但是
cached\u category\u list
不会初始化。我做错了什么?是否有人可以将缓存与此gem(我的版本是2.0.6)一起使用?

如果您将此与自有标记结合使用,这可能就是问题所在。 看看gem的代码,似乎不支持对所拥有的标记进行缓存

希望这有帮助

最好的,
嗯,今天我也有同样的问题。 我最终解决了这个问题,迁移缓存了所需的标记。 您的迁移有两个问题:

  • 设置缓存的ActsAsTaggable代码需要在重置列信息后再次运行。否则,不会创建缓存方法(请参阅)

  • 您正在调用的方法save_cached_tag_list不会自动保存记录,因为它是作为before_save钩子安装的,并且不希望创建无限循环。所以你必须打电话给save

  • 因此,尝试用以下内容替换迁移,它应该可以工作:

    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
    
    class AddCachedCategoryListProducts1000)do | p|
    p、 类别列表#似乎您需要先这样做才能生成列表
    p、 救命你错过了保存行!
    结束
    结束
    结束
    

    应该可以了。

    不需要
    p.save\u cached\u tag\u list
    ,因为before\u save钩子会调用它。@MichaelHale是的,我相信你看代码是正确的。我将编辑我的回答从现在起,是否对所有项目执行缓存?还是我必须时不时地运行它?它是如何工作的?缓存何时过期?产品的所有标签是否直接存储在模型表本身上?作为一根绳子?如果这个字符串变得非常大(比如说产品有30000个标签?),或者它存储在每个产品中(产品的标签直接存储在行本身中),该怎么办。什么时候到期?