Sto tentando di memorizzare nella cache un ActiveRecord con la sua associazione. Il problema è che c'è una query del database quando si accede alle associazioni su un record recuperato.Associazione limitata di cache
Normalmente, mi limito a memorizzare nella cache con il caricamento urgente Rails.cache.write('post', Post.includes(:comments).find(99))
. Questo sembra funzionare, ma il problema è che voglio solo memorizzare nella cache un sottoinsieme limitato dell'associazione, e i limiti vengono ignorati quando si carica con il eager (ad esempio, here). Quindi Post.includes(:popular_comments).find(99)
restituirebbe tutti i commenti, non solo quelli più popolari.
Così ho cercato la memorizzazione nella cache l'oggetto dopo il pigro a caricamento l'associazione, ma una query purtroppo si verifica quando si tira fuori gli oggetti:
class Post < ActiveRecord::Base
has_many :comments
has_many :popular_comments, :class_name > 'Comment', :limit => 20, :order => :votes
post = Post.find(99)
post.popular_comments # lazy-load limited associations
Rails.cache.write('post', post)
...
Rails.cache.read('post').popular_comments # Unwanted SQL query :(
ho provato la memorizzazione nella cache di un clone, invece, stessa query SQL indesiderato . E ho provato questo con entrambe le implementazioni redis e memcached, stesso risultato. Stranamente, questa sequenza funziona su console afaict, ma un semplice utilizzo in un controller o una vista come sopra non riesce (ad es. SQL si verifica).
Aggiornamento (aprile 2017): Direi che questa è una premessa stupida. Memorizzare nella cache gli oggetti interi è generalmente uno spreco poiché utilizza molta memoria cache ed è lento serializzarli/deserializzarli. Anche le associazioni di memorizzazione nella cache (come richiesto in questa domanda) moltiplicano lo spreco di N. Solitamente è più efficiente archiviare solo ID grezzi e frammenti HTML.
Quale versione di Rails stai utilizzando? – Brandan
@Brandan Questo è su Rails 3.1 – mahemoff
Puoi pubblicare uno snippet del log che mostra esattamente ciò che SQL viene eseguito e dove si trova nella richiesta? Non potrei riprodurlo – Brandan