default_scope
Dies funktioniert für Rails 4+:
class Book < ActiveRecord::Base
default_scope { order(created_at: :desc) }
end
Für Rails 2.3, 3 benötigen Sie stattdessen Folgendes:
default_scope order('created_at DESC')
Für Schienen 2.x:
default_scope :order => 'created_at DESC'
Wo created_at
ist das Feld, in dem die Standardsortierung durchgeführt werden soll?
Hinweis: ASC ist der Code für aufsteigende zu verwenden und DESC ist für den Abstieg ( desc
, NICHT dsc
!).
scope
Sobald Sie daran gewöhnt sind, können Sie auch Folgendes verwenden scope
:
class Book < ActiveRecord::Base
scope :confirmed, :conditions => { :confirmed => true }
scope :published, :conditions => { :published => true }
end
Für Rails 2 benötigen Sie named_scope
.
:published
Umfang gibt Ihnen Book.published
statt
Book.find(:published => true)
.
Seit Rails 3 können Sie diese Methoden miteinander verketten, indem Sie sie mit Punkten zwischen ihnen verketten. Mit den oben genannten Bereichen können Sie sie jetzt verwenden Book.published.confirmed
.
Bei dieser Methode wird die Abfrage erst ausgeführt, wenn die tatsächlichen Ergebnisse benötigt werden (verzögerte Auswertung). Daher können 7 Bereiche miteinander verkettet werden, was jedoch nur zu einer tatsächlichen Datenbankabfrage führt, um Leistungsprobleme bei der Ausführung von 7 separaten Abfragen zu vermeiden.
Sie können einen übergebenen Parameter wie ein Datum oder eine Benutzer-ID verwenden (etwas, das sich zur Laufzeit ändert und daher diese 'verzögerte Auswertung' mit einem Lambda wie diesem benötigt:
scope :recent_books, lambda
{ |since_when| where("created_at >= ?", since_when) }
# Note the `where` is making use of AREL syntax added in Rails 3.
Schließlich können Sie den Standardbereich deaktivieren mit:
Book.with_exclusive_scope { find(:all) }
oder noch besser:
Book.unscoped.all
Dadurch werden alle Filter (Bedingungen) oder Sortierungen (Reihenfolge nach) deaktiviert.
Beachten Sie, dass die erste Version in Rails2 + funktioniert, während die zweite (ohne Gültigkeitsbereich) nur für Rails3 + gilt
Also
... wenn du denkst, hmm, das sind also genau wie Methoden, dann ... yup, genau das sind diese Bereiche!
Sie sind wie haben, def self.method_name ...code... end
aber wie immer mit Rubin sind sie nette kleine syntaktische Abkürzungen (oder 'Zucker'), um die Dinge für Sie einfacher zu machen!
Tatsächlich handelt es sich um Methoden auf Klassenebene, da sie mit einem Satz von "allen" Datensätzen arbeiten.
Ihr Format ändert sich jedoch. Bei Schienen 4 wird bei Verwendung von #scope ohne Übergabe eines aufrufbaren Objekts eine Warnung vor Verfall angezeigt. Zum Beispiel Bereich: rot, wobei (Farbe: 'rot') in geändert werden soll scope :red, -> { where(color: 'red') }
.
Als Randnotiz kann bei falscher Verwendung das Standard- _scope missbraucht / missbraucht werden.
Hier geht es hauptsächlich darum, wann es für Aktionen wie where
das Einschränken (Filtern) der Standardauswahl (eine schlechte Idee für einen Standard) verwendet wird, anstatt nur zum Ordnen von Ergebnissen verwendet zu werden. Verwenden Sie
für die where
Auswahl einfach die regulären benannten Bereiche. und fügen Sie diesen Bereich in die Abfrage ein, z. B. Book.all.published
wo published
sich ein benannter Bereich befindet.
Zusammenfassend lässt sich sagen, dass die Bereiche wirklich großartig sind und Ihnen dabei helfen, die Dinge für einen DRYer-Ansatz mit „Fat Model Thin Controller“ in das Modell zu integrieren.
default_scope { order("#{table_name}.created_at DESC") }
?default_scope { order(created_at: :desc) }
4.2.6
scheint durch sortierenupdated_at
nichtcreated_at
.updated_at
standardmäßig sortieren ? : - |Ein kurzes Update zu Michaels hervorragender Antwort oben.
Für Rails 4.0+ müssen Sie Ihre Sortierung in einen Block wie folgt einfügen:
Beachten Sie, dass die order-Anweisung in einem Block steht, der durch geschweifte Klammern gekennzeichnet ist.
Sie haben es geändert, weil es zu einfach war, etwas Dynamisches (wie die aktuelle Zeit) einzugeben. Dadurch wird das Problem behoben, da der Block zur Laufzeit ausgewertet wird. Wenn Sie keinen Block verwenden, wird folgende Fehlermeldung angezeigt:
Wie @Dan in seinem Kommentar unten erwähnt, können Sie eine rubinrotere Syntax wie folgt verwenden:
oder mit mehreren Spalten:
Danke @Dan !
quelle
default_scope { order(created_at: :desc) }
ob Sie wie ich versuchen, die SQL-Syntax in Rails zu minimieren. <br/> Wenn Sie mehrere Spalten zum Ordnen haben und die neue Syntax verwenden möchten, müssen Sie möglicherweise den desc umbrechen Spalten in Schnurrbärten wie diesedefault_scope { order({begin_date: :desc}, :name) }
Mit default_scope können Sie eine Standardsortierreihenfolge implementieren: http://api.rubyonrails.org/classes/ActiveRecord/Scoping/Default/ClassMethods.html
quelle
default_scope
auf dieser Seite, weil sie von Refactoring wurdeActiveRecord::Base
inActiveRecord::Scoping::Default::ClassMethods
( api.rubyonrails.org/classes/ActiveRecord/Scoping/Default/... )