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' }

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

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) }

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') }


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") }

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) }

1

Dies funktioniert bei mir in Rails 4

default_scope { order(external_updated_at: :desc) }

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

Vergiss das ->Symbol nicht


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.