2011-01-06 8 views
1

Rails hat diese schönen chainable Methoden. Wie füge ich meine eigenen hinzu? Ich dachte, eine Klassenmethode im Modell zu definieren, von dem ich möchte, dass meine eigene Methode aufrufen, aber dies würde nur zu Beginn einer „Kette“ arbeiten:Definieren einer benutzerdefinierten "kettenfähigen" ActiveRelation-Methode wie `order` und` limit`

class << self 
    def order_by_specialness 
    order(:specialness) 
    end 
end 

Ich vermute, ich brauchen würde, ActiveRecord::Relation irgendwie zu verlängern , da dies von jeder der kettenfähigen Abfragemethoden zurückgegeben wird. Aber von da an bin ich ratlos.

Antwort

3

Sie wollen scope verwenden:

scope :order_by_specialness, order(:specialness) 

Anruf mit:

User.order_by_specialness.first 

Obwohl order_by_specialness mit nicht wirklich Sie jederzeit speichern. Sie sollten etwas genauso wie special verwenden:

User.special.first 
+0

Benannte Bereiche sind "tot"; http://www.railway.at/2010/03/09/named-scopes-are-dead/ – Bjorn

+0

Nein, sind sie nicht. – Garrett

+0

Um auf @Garrett zu erweitern, hat der Eisenbahnautor, der vorschlägt, keine Scopes zu verwenden, einen Fehler mit dem Rails-Team eingereicht, das sie behoben haben, wobei er seinen Standpunkt vertritt, dass man keine Scopes verwenden sollte. https://rails.lighthouseapp.com/projects/8994-ruby-on-rails/tickets/4142-arel-methods-in-scope-cause-issues-with-non-existent-tables – SooDesuNe

Verwandte Themen