Rails 4 Standardbereich

74

In meiner Rails-App gibt es einen Standardbereich, der folgendermaßen aussieht:

default_scope order: 'external_updated_at DESC'

Ich habe jetzt ein Upgrade auf Rails 4 durchgeführt und erhalte natürlich die folgende Warnung: "Das Aufrufen von #scope oder #default_scope mit einem Hash ist veraltet. Bitte verwenden Sie ein Lambda, das einen Bereich enthält." Ich habe meine anderen Bereiche erfolgreich konvertiert, weiß aber nicht, wie die Syntax für default_scope lauten soll. Das funktioniert nicht:

default_scope, -> { order: 'external_updated_at' }
Joe Gatt
quelle
Verwandte: Sollte default_scope insgesamt vermieden werden , und was sind einige alternative Ansätze?
Jay

Antworten:

152

Sollte nur sein:

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

default_scope akzeptiert einen Block, Lambda ist für scope () erforderlich, da es zwei Parameter gibt, name und block:

class Shirt < ActiveRecord::Base
  scope :red, -> { where(color: 'red') }
end
Luke
quelle
Danke für die Erklärung, Luke. Ich habe einen Syntaxfehler erhalten, dann habe ich ihn in default_scope {order ('external_updated_at')} geändert und es hat funktioniert. Können Sie bitte Ihre Antwort bearbeiten, damit ich sie bestätigen kann?
Joe Gatt
6
Dies hat bei mir in 4.0.2 ohne Pfeil nicht funktioniert. Meine Arbeitslösung wardefault_scope -> { order_by(:created_at => :desc) }
Genkilabs
1
Konventionell werden Symbole bevorzugt, wenn auf Attribute verwiesen wird. default_scope { order(:external_updated_at) }
Scarver2
3
Übrigens Die richtige Antwort auf @ JoeGatt Frage istdefault_scope order('external_updated_at DESC')
scarver2
Dies gilt nicht für die Bestellung, wenn Sie Ergebnisse haben, bei denen die Groß- und Kleinschreibung unterschiedlich ist (Groß- / Kleinschreibung). Haben Sie Gedanken zur Bestellung über default_scope, während Sie die Groß- und Kleinschreibung erzwingen?
Kees Briggs
21

Das hat bei mir funktioniert:

default_scope  { order(:created_at => :desc) }
Qubit
quelle
3
In neuer Ruby-Syntax:default_scope { order(created_at: :desc) }
Jeehut
7

Das hat auch bei mir funktioniert:

default_scope { order('created_at DESC') }

Alex Hawkins
quelle
2

Dies funktionierte bei mir (nur zur Veranschaulichung mit einem Wo), weil ich über das gleiche Problem zu diesem Thema kam.

default_scope { where(form: "WorkExperience") }
FastSolutions
quelle
2

Sie können auch das lambdaSchlüsselwort verwenden. Dies ist nützlich für mehrzeilige Blöcke.

default_scope lambda {
  order(external_updated_at: :desc)
}

das ist äquivalent zu

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

und

default_scope { order(external_updated_at: :desc) }
Chris McKnight
quelle
1

Dies funktioniert bei mir in Rails 4

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

Vergiss das ->Symbol nicht

Abel
quelle
0
default_scope { 
      where(published: true) 
}

Versuche dies.

aliAsadi92
quelle