2013-08-29 5 views
70

Nella mia applicazione Rails hanno un ambito predefinito che assomiglia a questo: #scopeRails 4 ambito predefinito

default_scope order: 'external_updated_at DESC' 

Ora ho aggiornato a Rails 4 e, naturalmente, ottengo il seguente avvertimento deprecazione "Chiamata o #default_scope con un hash è deprecato. Si prega di utilizzare un lambda contenente un ambito. ". Ho convertito con successo i miei altri ambiti ma non so quale dovrebbe essere la sintassi di default_scope. Questo non funziona:

default_scope, -> { order: 'external_updated_at' } 
+0

correlati: dovrebbe essere default_scope [tutto evitato] (https://github.com/rails/rails/issues/13965 # issuecomment-34407465) e quali sono alcuni approcci alternativi? – Jay

risposta

146

dovrebbe essere solo:

class Ticket < ActiveRecord::Base 
    default_scope { order(:external_updated_at) } 
end 

default_scope accettare un blocco, lambda è necessaria per la portata(), perché ci sono 2 parametri, il nome e il blocco:

class Shirt < ActiveRecord::Base 
    scope :red, -> { where(color: 'red') } 
end 
+0

Grazie per la spiegazione, Luca. Ho ricevuto un errore di sintassi, quindi l'ho modificato in default_scope {order ('external_updated_at')} e ha funzionato. Puoi modificare la tua risposta, per favore, così posso confermarla? –

+5

Questo non ha funzionato per me in 4.0.2 senza la freccia. La mia soluzione di lavoro era '' 'default_scope -> {order_by (: created_at =>: desc)}' '' – genkilabs

+1

Per convenzione, i simboli sono preferiti quando si fa riferimento agli attributi. 'default_scope {order (: external_updated_at)}' – scarver2

21

Questo è ciò che ha funzionato per me:

default_scope { order(:created_at => :desc) } 
+1

Grazie a @Leslie. Funziona su Rails 4, non Rails 3. – scarver2

+3

Nella nuova sintassi Ruby: 'default_scope {order (created_at:: desc)}' – Dschee

7

Anche questo ha funzionato per me:

default_scope { order('created_at DESC') }

1

questo ha funzionato da me (solo per l'illustrazione con un dove), perché sono arrivato a questo tema tramite lo stesso problema.

default_scope { where(form: "WorkExperience") } 
1

Questo funziona per me in Rails 4

default_scope { order(external_updated_at: :desc) } 
0
default_scope -> { order(created_at: :desc) } 

Non dimenticare il simbolo ->

0
default_scope { 
     where(published: true) 
} 

Try This.

2

È inoltre possibile utilizzare la parola chiave lambda. Questo è utile per i blocchi multilinea.

default_scope lambda { 
    order(external_updated_at: :desc) 
} 

che equivale a

default_scope -> { order(external_updated_at: :desc) } 

e

default_scope { order(external_updated_at: :desc) }