2010-10-15 9 views
6

Tengo modelo con el contexto de la etiqueta:Cómo guardar etiquetas con acts_as_taggable_on?

class Product < ActiveRecord::Base 
    acts_as_taggable_on :categories 
end 

Estoy tratando de inicializar el almacenamiento en caché etiquetas:

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 

Pero cached_category_list no inicializar. ¿Qué estoy haciendo mal? ¿Alguien puede usar el almacenamiento en caché con esta joya (mi versión es 2.0.6)?

Respuesta

-3

Si está utilizando esto en combinación con las etiquetas de propiedad, ese podría ser el problema. Si examina el código de la gema, parece que el almacenamiento en caché de las etiquetas de propiedad no se admite

Espero que esto ayude,

mejor, J

13

Bueno, hoy he tenido el mismo problema. Finalmente lo resolví y mi migración almacenó en caché las etiquetas deseadas. El problema de la migración ha sido doble:

  1. El código ActsAsTaggable que establece el almacenamiento en caché tiene que correr de nuevo después de la información de la columna se pone a cero. De lo contrario, los métodos de almacenamiento en caché no se crean (ver https://github.com/mbleigh/acts-as-taggable-on/blob/v2.0.6/lib/acts_as_taggable_on/acts_as_taggable_on/cache.rb)

  2. El método que está llamando, save_cached_tag_list, no guarda automáticamente el registro, ya que se instala como un gancho before_save, y no lo hace quiero crear un bucle infinito Entonces debes llamar guardar.

lo tanto, intentar reemplazar su migración a la siguiente, y debería funcionar:

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 

Eso debería hacerlo.

+0

No es necesario 'p.save_cached_tag_list' ya que será llamado por el gancho before_save. –

+0

@MichaelHale Sí, creo que estás en lo correcto al mirar el código. Voy a editar mi respuesta –

+1

Todavía funciona perfectamente en rieles 4. – ahnbizcad

Cuestiones relacionadas