Как кешировать теги с act_as_taggable_on? - PullRequest
6 голосов
/ 16 октября 2010

У меня есть модель с контекстом тега:

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 не инициализируется. Что я делаю не так? Кто-нибудь может использовать кеширование с этим гемом (моя версия 2.0.6)?

Ответы [ 2 ]

15 голосов
/ 25 апреля 2011

Ну, сегодня у меня была такая же проблема. Я наконец решил это, и моя миграция кэшировала нужные теги. Проблема с вашей миграцией была двоякой:

  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 и не хочет создавать бесконечный цикл. Поэтому вы должны позвонить сохранить.

Итак, попробуйте заменить вашу миграцию на следующую, и она должна работать:

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

Это должно сделать это.

0 голосов
/ 20 февраля 2011

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

Надеюсь, это поможет,

Best, J

...