How to cache tags with acts_as_taggable_on?

前端 未结 2 704
后悔当初
后悔当初 2021-01-13 00:50

I have model with tag context:

class Product < ActiveRecord::Base
  acts_as_taggable_on :categories
end

I\'m trying to initialize tags c

2条回答
  •  滥情空心
    2021-01-13 01:38

    Well, today I had the same problem. I finally solved it, and my migration cached the desired tags. The problem with your migration was two-fold:

    1. The ActsAsTaggable code which sets up caching needs to run again after the column information is reset. Otherwise, the caching methods are not created (see https://github.com/mbleigh/acts-as-taggable-on/blob/v2.0.6/lib/acts_as_taggable_on/acts_as_taggable_on/cache.rb)

    2. The method you are calling, save_cached_tag_list, does NOT automatically save the record, as it is installed as a before_save hook, and it doesn't want to create an infinite loop. So you must call save.

    So, try replacing your migration with the following, and it should work:

    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
    

    That should do it.

提交回复
热议问题