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


person Voldy    schedule 15.10.2010    source источник


Ответы (2)


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

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

Бест, Дж.

person Jevado    schedule 20.02.2011

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

  1. Код ActsAsTaggable, который настраивает кэширование, необходимо запустить снова после сброса информации столбца. В противном случае методы кэширования не создаются (см. ="noreferrer">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 и не хочет создавать бесконечный цикл. Поэтому вы должны вызвать 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

Это должно сработать.

person ms-ati    schedule 24.04.2011
comment
Нет необходимости в p.save_cached_tag_list, так как он будет вызываться хуком before_save. - person Michael Hale; 31.10.2012
comment
@MichaelHale да, я считаю, что вы правы, глядя на код. я отредактирую свой ответ - person ms-ati; 02.11.2012
comment
Выполняет ли это кэширование всех элементов? Или я должен запускать это время от времени? - person nitsujri; 24.04.2015
comment
Как это работает? Когда истекает срок действия кеша? Все ли теги продукта хранятся непосредственно в самой таблице модели? В виде строки? Что делать, если эта строка становится очень большой (скажем, у продуктов 30000 тегов?) Или она сохраняется для каждого продукта (теги продукта хранятся непосредственно в самой строке). Когда он истекает? - person Jwan622; 11.10.2018