Domanda

Devo memorizzare nella cache (e scadere) tutti i modelli in una tabella.

Ad esempio, se ho un modello chiamato Valuta, ho solo meno di 10 valute possibili. Pertanto, sarebbe bello avere:

class Currency < ActiveRecord::Base
  cache_all(:expire_in => 10.minutes)
end

in modo che

Currency.all
Currency.find_by_name("USD")

non dovrebbe colpire il DB.

Cosa pensi possa essere un buon approccio?

Inoltre, se ritieni che sarebbe meglio usare un modello di cui non è stato eseguito il backup da un DB, ti preghiamo di commentare questo. Si prega di notare che vorrei avere un'associazione in stile AR.

È stato utile?

Soluzione

Poiché il set di dati è così piccolo, probabilmente la cosa migliore è memorizzarlo nella memoria locale. Ci sono un paio di modi per farlo, uno è usare Memoization come I mostra qui . Tuttavia, questo non è il più efficiente perché memorizzerà il metodo all e il metodo find_by_name in cache separate anche se sono lo stesso oggetto.

Un'alternativa è ridefinire i metodi per memorizzare manualmente nella cache gli oggetti. Qualcosa del genere.

class Currency < ActiveRecord::Base
  def self.all
    @all_cache ||= super.map(&:freeze) # freeze so you don't modify the cached objects
  end

  def self.find_by_name(name)
    all.detect { |c| c.name.to_s.downcase == name.to_s.downcase }
  end

  def self.flush_all_cache
    @all_cache = nil
  end
end

Potrebbe esserci un plug-in per gestirlo, ma non l'ho ancora esaminato.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top