Ein Scope in Active Record ist nichts anderes als syntaktischer Zucker für das Definieren einer Klassenmethode. Die folgenden User-Models führen zum selben Ergebnis:
class User < ActiveRecord::Base scope :admins, -> { where(role: "admin") } end
class User < ActiveRecord::Base def self.admins where(role: "admin") end end
Da man Scopes verketten kann drängt sich der (berechtigte) Verdacht auf, dass dies mit jeder Form von Klassenmethode möglich ist.
class User < ActiveRecord::Base scope :admins, -> { where(role: "admin") } def self.names pluck(:name) end end
Dies funktioniert. Man kann auf diese Weise jede zusammengestellte Relation beliebig verarbeiten. Obiges Beispiel ließe sich etwa folgendermaßen anwenden:
User.create(name: "Klaus", role: "admin") User.create(name: "Markus", role: "admin") User.create(name: "Max") puts User.admins.names # ["Klaus", "Markus"]
Dies ist eine interessante Eigenschaft, die mir in den bisherigen Rails-Dokumentationen nicht aufgefallen ist. Erst nach gezielter Suche konnte ich einen Hinweis in den API-Docs finden.