2013-08-29 13 views
70

W mojej aplikacji Rails mieć zakres domyślny, który wygląda tak:Szyny 4 domyślny zakres

default_scope order: 'external_updated_at DESC' 

Mam teraz uaktualniony do szyn 4 i, oczywiście, pojawia się następujące ostrzeżenie dezaprobata „Wywołanie #scope lub #default_scope z hashem jest przestarzałe. Użyj lambda z zakresem. ". Udało mi się przekonwertować inne moje zasięgi, ale nie wiem, jaka powinna być składnia dla default_scope. To nie działa:

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

powiązanych: powinien być default_scope [całkowicie uniknąć] (https://github.com/rails/rails/issues/13965 # issuecomment-34407465) i jakie są alternatywne podejścia? – Jay

Odpowiedz

146

powinno być tylko:

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

default_scope przyjąć blok, lambda jest konieczne dla zakresu(), ponieważ są 2 parametry, nazwa i blok:

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

Dzięki za wyjaśnienie, Luke. Dostałem błąd składni, a następnie zmieniłem go na default_scope {order ('external_updated_at')} i zadziałało. Czy możesz edytować swoją odpowiedź, więc mogę ją zaakceptować? –

+5

To nie działało dla mnie w wersji 4.0.2 bez strzałki. Moje działające rozwiązanie to '' default_scope -> {order_by (: created_at =>: desc)} '' ' – genkilabs

+1

Zgodnie z konwencją symbole są preferowane podczas porównywania atrybutów. 'default_scope {order (: external_updated_at)}' – scarver2

21

to co pracował dla mnie:

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

Dzięki @Leslie. Działa to w Railsach 4, nie Railsach 3. – scarver2

+3

W nowej składni Ruby: 'default_scope {order (created_at:: desc)}' – Dschee

7

to również pracował dla mnie:

default_scope { order('created_at DESC') }

1

To działało mi (tylko dla ilustracji z gdzie), bo przyszedł na ten temat za pośrednictwem tego samego problemu.

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

To działa na mnie w Rails 4

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

nie zapomnij -> symbol

0
default_scope { 
     where(published: true) 
} 

spróbować.

2

Można również użyć słowa kluczowego lambda. Jest to przydatne w przypadku bloków wielowierszowych.

default_scope lambda { 
    order(external_updated_at: :desc) 
} 

co odpowiada

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

i

default_scope { order(external_updated_at: :desc) }