2011-01-08 9 views
4

Rails-Modelle kommen mit bestimmten integrierten Methoden wie folgt aus:Auszugsschienen Modelle

Appointment.new 
Appointment.find(1) 

Wie füge ich mehr Methoden zu Appointment? Es ist anscheinend nicht durch Hinzufügen von Methoden zu app/models/appointment.rb getan. Dadurch werden Methoden zu einer Instanz von Appointment hinzugefügt, aber ich möchte Methoden zu Appointment selbst hinzufügen. Wie mache ich das?

+2

btw, der Begriff Sie suchen ist „Klassenmethoden“ (im Gegensatz zu "Instanzmethoden"). – ryeguy

+0

Okay, danke. Ich habe mich gefragt, was das ist. –

+0

'MyClass.new' ist, wie Sie eine Standard-Ruby-Klasseninstanz BTW initiieren, es hat nichts mit Rails zu tun. –

Antwort

12
def self.some_method 
    #do stuff 
end 
+3

Wenn Sie weiter untersuchen wollen: Sie werden "Klassenmethoden" oder "statische Methoden" genannt, abhängig von der Sprache, aus der Sie kamen (oder beiden, wenn Sie von Python kommen). – FlorianH

3

Mark Antwort der ist auf jeden Fall richtig, aber Sie werden auch die folgende Syntax sehen, wenn Klassenmethoden definieren:

class Appointment 
    class << self 
    def method1 
     # stuff 
    end 

    def method2 
     # stuff 
    end 

    def method3 
     # stuff 
    end 
    end 
end 
+0

Gibt es einen Vorteil davon, dies zu tun? Weil es sonst wie ein schrecklich verwirrender Weg scheint; 'class << self 'ergibt überhaupt keinen Sinn! –

+0

@Ashley Ich kann mir mindestens zwei Vorteile dieser Syntax vorstellen. 1) Sie müssen nicht vor jeder Methode "self" schreiben, wenn Sie eine Menge Klassenmethoden haben und 2) Alle Klassenmethoden sind eingerückt und gruppiert. Alles ist verwirrend, wenn Sie es noch nie zuvor gesehen haben, aber es wird definitiv von vielen Ruby-Entwicklern verwendet. Hier ist es in der Rails active record Quelle: https://github.com/rails/rails/blob/master/activerecord/lib/active_record/base.rb#L426 –

+0

Ich habe diese Praxis tatsächlich viel gesehen (und schamlos benutzte es ein- oder zweimal vor mir selbst), aber es scheint immer noch seltsam, fast ein Sprach-Hack wie '[* $ <]', der zwar vollkommen gültig ist, aber unnötig kryptisch ist, besonders im Open-Source-Code, wo Außenstehende verstehen und verstehen umarme es. Ruby ist die meiste Zeit eine elegante Sprache, es ist so eine Schande, sie mit übermäßig intelligentem Code wie diesem zu verwechseln, wo man ihnen helfen kann. –