2011-10-28 9 views
6

Problema: evitare di creare più oggetti o più query quando possibile.Usare i presentatori di rotaie - memoizable diventando deprecato in 3.1 - usare || = invece?

Uso i presentatori con le guide come best practice.

Seguo un consiglio che dice che sarebbe opportuno utilizzare "estendere ActiveSupport.Memoizable" (e quindi memoize: metodo (i) per utilizzarli) durante la configurazione di elementi con stile @the_record = record ||= @record a causa di un paio di problemi - false o nil non vengono memorizzate, quindi la query viene richiamata di nuovo e anche quella memoizable utilizza meglio la cache (cioè la usa!).

Tuttavia vedo che memoizable è sempre deprecato in Rails 3.1 Avvertenze i GitHub sotto carrierwave e con la dichiarazione: "disapprovazione ATTENZIONE: ActiveSupport :: Memoizable è deprecato e sarà rimosso nelle versioni future, è sufficiente utilizzare Rubino modello Memoizzazione invece . (chiamato da estendersi /Users/kain/.rvm/gems/ruby-1.9.3-preview1/bundler/gems/carrierwave-c4459179b0f8/lib/carrierwave/mount.rb:284" .

Forse è passato Qualcuno sa?

Qualche suggerimento sulla procedura migliore da utilizzare in futuro? Utilizzare la sintassi || =? E i problemi precedenti?

enter image description here

risposta

7

Il metodo ||= è grande per le cose che restituiscono valori che valutano come vero, ma non funziona molto bene per le cose che non lo fanno. memoize funziona attorno a ciò intrappolando queste condizioni e restituendo di conseguenza. Si potrebbe adottare un approccio come questo se si desidera ospitare nil:

def some_method 
    return @some_method if (instance_variable_defined?(:"@some_method")) 

    @some_method = begin 
    ... 
    end 
end 

Questo solo controlla se è definita la variabile, se non è impostata, che è una distinzione importante nel tuo caso.

Non sono sicuro del motivo per cui pensi che sia deprecato [Nota di Michael, è deprecata in 3.2, vedi nota sotto]. documentation indica che è ancora presente in 3.1. A volte le implementazioni sono contrassegnate come "deprecate" quando vengono spostate da un modulo a un altro, ma la funzione rimane disponibile.

+0

Beh, mi sono guardato intorno e forse un'implementazione precedente è stata ritirata. Ad ogni modo andrò con Memoizable ora so che posso fare affidamento su 3.1 Thx Tadman! –

+1

Aspetta Ho trovato l'avviso, è sull'eccellente railsbest corso su presentatori e memoization. Sono conosciuti come il corso 'Rails for Zombies'. Comunque hanno dato le informazioni sulla memoizzazione, hanno detto che le opzioni di ActiveSupport erano le migliori e tuttavia la loro vera sfida per il codice dice "ActiveSupport :: Memoizable (nota: ActiveSupport :: Memoizable è deprecato in Rails 3.1)"! quindi ancora non ne sono sicuro e se diventa deprecato è perché i problemi di cui sopra saranno risolti, ecc. –

+3

Deprecati al punto 3.2: http://guides.rubyonrails.org/3_2_release_notes.html#activesupport_deprecations – m33lky

Problemi correlati