2012-08-10 10 views
13

Kann jemand erklären, was diese Methode tut und was kann ich darauf übertragen?Scoped und scope in rails

scoped(options = nil) 
Returns an anonymous scope. 

Und was auch die Scope-Methode? Ich verstehe es nicht nach dem Lesen der Dokumentation.

Antwort

30

In Active, alles Abfrage Bauweisen (wie where, order, joins, limit usw.) liefert einen so Umfang genannt. Nur wenn Sie eine Kicker-Methode wie all oder first aufrufen, wird die aufgebaute Abfrage ausgeführt und die Ergebnisse aus der Datenbank zurückgegeben. Die Klassenmethode gibt auch einen Bereich zurück. Der zurückgegebene Bereich ist standardmäßig leer, was bedeutet, dass die Ergebnismenge in keiner Weise eingeschränkt wird, was bedeutet, dass alle Datensätze zurückgegeben würden, wenn die Abfrage ausgeführt wurde. Sie können es verwenden, um eine "leere" Alternative wie in der query_by_date Beispiel von MurifoX bereitzustellen. Oder Sie können es verwenden, um mehrere Bedingungen in einem Methodenaufruf, wie zum Beispiel zu kombinieren:

Model.scoped(:conditions => 'id < 100', :limit => 10, :order => 'title ASC') 

# which would be equivalent to 
Model.where('id < 100').limit(10).order('title ASC') 

Die scope Klassenmethode können Sie definieren eine Klassenmethode, die auch einen Bereich gibt, wie zum Beispiel:

class Model 
    scope :colored, lambda {|col| 
    where(:color => col) 
    } 
end 

, die wie folgt verwendet werden kann:

Model.colored 

Die nette Sache mit Bereichen ist, dass man sie kombinieren kann (fast) wie Sie wollen, so dass die folgende ist durchaus möglich:

Model.red.where('id < 100').order('title ASC').scoped(:limit => 10) 

ich stark auch vorschlagen, das Lesen durch http://guides.rubyonrails.org/active_record_querying.html

+0

Danke severin, es hat geholfen. Woher weiß ich, was ich an .scoped weitergeben kann? Ich sehe: Bedingungen => usw. – LuckyLuke

+1

Sie finden eine vollständige Liste aller Optionen hier: http://api.rubyonrails.org/classes/ActiveRecord/FinderMethods.html#method-i-find-label-Options – severin

+0

Awesome ! Vielen Dank für Ihre Hilfe – LuckyLuke

5

Ich habe es in der past.When verwendet machen Sie gekettet Anrufe an die ActiveRecord Abfrage-Schnittstelle wie folgt aus:

Model.where(:conditions).where(:more_conditions).where(:final_conditions) 

Jeder von ihnen ist bereits scoped, ohne Probleme die Kette Arbeit machen. Aber lassen Sie uns sagen, Sie haben etwas wie folgt:

Dies würde einen Fehler verursachen, wenn der Datumsparameter nicht heute oder morgen ist. Es würde den letzten Wert auswählen und versuchen, diese Abfrage mit der nächsten query_by_user zu ketten, was zu einer undefined method default_scoped? for '' führt. Aber wenn Sie eine -Methode in der else-Bedingung setzen, würde es ohne Fehler funktionieren, weil Sie zu ActiveRecord sagen, dass Sie diese Methode/benannten Bereich durchlaufen und keine Aufrufe an where/find/other activerecord methods gemacht, aber ein Objekt im Bereich zurückgegeben, So können Sie Abfragen und andere Dinge weiter verketten.
Es wäre am Ende so.

else 
    scoped 
end 

Ich hoffe, Sie verstehen dieses einfache Beispiel.

+0

Könnten Sie erklären, was es bedeutet, zu sein „scoped“? – LuckyLuke

+1

Es ist wie "sein" ein ActiveRecord-konform. Gekapselt von allen ActiveRecords-Spezifikationen. – MurifoX

+0

Ich bin mir nicht sicher, ob ich "scoped" verstehe, außer dass ich verstehe, was du meinst ... das heißt, ich sehe, dass es sonst scheitern wird. Aber ich verstehe nicht, was das "Scoped" tun kann und ist. – LuckyLuke