2010-10-15 7 views
6

Ich habe Modell mit dem Tag Kontext:Wie man Tags mit acts_as_taggable_on zwischenspeichert?

class Product < ActiveRecord::Base 
    acts_as_taggable_on :categories 
end 

Ich versuche Tags Caching zu initialisieren:

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 

Aber cached_category_list nicht initialisiert. Was mache ich falsch? Kann jemand Caching mit diesem Juwel verwenden (meine Version ist 2.0.6)?

Antwort

-3

Wenn Sie dies in Kombination mit eigenen Tags verwenden, könnte dies das Problem sein. auf dem Code des Edelsteins Blick scheint es, dass die Cache-Speicherung von im Besitz Tags nicht

hoffte, das hilft,

unterstützen wird

Best, J

13

Nun, heute hatte ich das gleiche Problem. Ich habe es schließlich gelöst, und meine Migration cached die gewünschten Tags. das Problem bei der Migration war zweifach:

  1. Der ActsAsTaggable Code, den Caching wieder ausgeführt werden muss einrichtet, nachdem die Spalteninformationen zurückgesetzt. Andernfalls werden die Caching-Methoden nicht erstellt (siehe https://github.com/mbleigh/acts-as-taggable-on/blob/v2.0.6/lib/acts_as_taggable_on/acts_as_taggable_on/cache.rb)

  2. Die Methode, die Sie anrufen, save_cached_tag_list, nicht automatisch den Datensatz speichern, da es als BEFORE_SAVE Haken installiert ist, und es funktioniert nicht möchte eine Endlosschleife erstellen. Sie müssen also speichern aufrufen.

Also, versuchen Sie die Migration mit den folgenden zu ersetzen, und es sollte funktionieren:

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 

Das sollte es tun.

+0

Es gibt keine Notwendigkeit für 'p.save_cached_tag_list', da dies vom before_save-Hook aufgerufen wird. –

+0

@MichaelHale Ja, ich glaube, Sie haben Recht, wenn Sie sich den Code anschauen. Ich bearbeite meine Antwort –

+1

Funktioniert immer noch perfekt in Schienen 4. – ahnbizcad

Verwandte Themen