Cache tutti i modelli in una tabella
-
11-07-2019 - |
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.
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.