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.