2016-03-25 6 views
3

ScopesWarum würden Sie einen Bereich verwenden, wenn Sie normale Ruby-Klassenmethoden verwenden könnten?

class Comment < ActiveRecord::Base 
    scope :most_recent, -> (limit) { order("created_at desc").limit(limit) } 
end 

Umfang

@recent_comments = Comment.most_recent(5) 

Klassenmethoden

In-Modell

def self.most_recent(limit) 
    order("created_at desc").limit(limit) 
end 

im Regler

@recent_comments = Comment.most_recent(5) 

Warum würden Sie einen Bereich verwenden, wenn Sie normale Ruby-Klassenmethoden verwenden könnten?

+0

würde ich nicht ..... –

+3

sauber Erklärung des Unterschieds ist hier: http://blog.plataformatec.com.br/2013/02/active-record-scopes-vs-class-methods/ – twonegatives

Antwort

1

Ich denke, der größte Grund für die Verwendung ist, weil es immer eine ActiveRecord::Relation zurückgeben würde, auch wenn der Bereich nil im Gegensatz zur Klassenmethode auswertet. Sie können einem Bereich auch spezifische Methoden hinzufügen, die nicht in der Klasse vorhanden sind, es sei denn, der Bereich wird aufgerufen.

scope :lovely, -> name { where(name: name) if name.present? } 

Dies würde die Sammlung zurückgeben, wenn es keinen Namen gibt. Aber in Klassenmethode, würden Sie so etwas wie dieses

def self.lovely(name) 
    if name.present? 
    where(name: name) 
    else 
    all 
    end 
end 
zu tun haben

Sie hier mehr Dokumentation von Bereichen finden: Active Record scopes vs class methods und hier: Should You Use Scopes or Class Methods? und ActiveRecord::Scoping::Named::ClassMethods

Verwandte Themen