2011-01-08 3 views
11

in Ruby on Rails è possibile trovare record dal database con la seguente sintassi:Ruby on Rails: Come impostare "trovare" le opzioni in modo da non utilizzare la cache

<model_name>.find_by_<field_name>() 

Esempi: User.find_by_email('[email protected]'), User.find_by_id(1),. ..

Tempo fa, se non sbaglio, ho letto da qualche parte che è possibile disattivare esplicitamente la memorizzazione nella cache per le operazioni di 'find', ma non riesco a ricordare come.

Qualcuno può aiutarmi a ricordare?

+0

Non ho visto la configurazione della cache di default ... Sei sicuro? hai controllato i tuoi registri? – apneadiving

+0

Sono d'accordo con apneadiving. Non penso che sia memorizzato nella cache per impostazione predefinita. –

risposta

18

È possibile utilizzare ActiveRecord::QueryCache.uncached come questo:

User.find_by_email('[email protected]') 
User.find_by_email('[email protected]') # Will return cached result 

User.uncached do 
    User.find_by_email('[email protected]') 
    User.find_by_email('[email protected]') # Will query the database again 
end 

In un controller, sarebbe simile a questa:

def show # users#index action 
    User.uncached do 
    @user = User.find_by_email('[email protected]') 
    @another_user = User.find_by_email('[email protected]') # Will query database   
    end 

    User.find_by_email('[email protected]') # Will *not* query database, as we're outside of the Users.uncached block 
end   

Ovviamente, in un modello, basta fare:

class User < ActiveRecord::Base 
    def self.do_something 
    uncached do 
     self.find_by_email('[email protected]') 
     self.find_by_email('[email protected]') # Will query database 
    end 
    end 
end 

User.do_something # Will run both queries 
+0

Non ho capito come usare questi codici: cosa devo mettere al posto di 'self.find (...)'? Puoi fare un esempio pratico? – user502052

+0

Ho aggiornato i miei esempi ma è difficile quando mi dai solo codice astratto. Vuoi usarlo in un controller o in un modello? Se controller, puoi usare il mio primo esempio. Se il modello, è possibile utilizzare il mio ultimo. Potrebbe essere più facile se pubblichi ciò che stai cercando di fare, invece di cercare di trovare esempi che abbiano senso per te. – vonconrad

+0

Grazie mille. – user502052

2

(Nota:. Assumendo Rails3, dal momento che Rails2 non ha la memorizzazione nella cache di default)

Questo dovrebbe funzionare come si desidera fuori dalla scatola:

  1. Query cache vengono distrutti dopo ogni azione (http://guides.rubyonrails.org/caching_with_rails.html paragrafo 1.5)
  2. Inoltre, sembra (http://ryandaigle.com/articles/2007/2/7/what-s-new-in-edge-rails-activerecord-explicit-caching) che le cache sono anche distrutti su aggiornamenti attributo/record

Avete un caso d'uso specifico non coperto dalla configurazione di default?

+0

Sto cercando di risolvere questo problema in qualche modo: http://stackoverflow.com/questions/4636704/chache-problem-running-two-consecutive-http-get-requests-from-an-app1-to-an-app2 – user502052