2010-08-11 20 views

Antwort

37

Eine Möglichkeit ist in einem module gemeinsame Methoden zu setzen, wie dieses (RAILS_ROOT/lib/shared_methods.rb)

module SharedMethods 
    def is_public? 
    # your code 
    end 
end 

Dann benötigen Sie zwei um diesen Modul in jedem Modell, das diese Methoden (dh app/models/your_model.rb) haben sollte

class YourModel < ActiveRecord::Base 
    include SharedMethods 
end 

UPDATE:

In Rails 4 befindet sich ein new way dies zu tun. Sie sollten Code wie folgt in app/models/concerns statt lib von

Auch geteilt Ort, den Sie Klassenmethoden hinzufügen und Ausführen von Code über die Aufnahme wie diese

module SharedMethods 
    extend ActiveSupport::Concern 

    included do 
    scope :public, -> { where(…) } 
    end 

    def is_public? 
    # your code 
    end 

    module ClassMethods 
    def find_all_public 
     where #some condition 
    end 
    end 
end 
+0

aber ich müsste eine Variable übergeben die sagen, Methode, welche Klasse ich verwende ... – NullVoxPopuli

+1

self.class würde Ihnen geben, was auch immer die Klasse im Zusammenhang mit dieser Methode aufgerufen wird. Also, zum Beispiel, wenn Sie YourModel.new.is_public ?, wäre self.class YourModel. – lambdabutz

5

können Sie auch dies tun, indem Sie die Modelle von einem gemeinsamen Vorfahren erben die enthält die gemeinsamen Methoden.

class BaseModel < ActiveRecord::Base 
    def is_public? 
    # blah blah 
    end 
end 

class ChildModel < BaseModel 
end 

In der Praxis jigfox ‚s Ansatz funktioniert oft besser aus, so fühlen sich nicht verpflichtet, Vererbung zu verwenden nur aus Liebe zu OOP Theorie :)

+0

Ich möchte es so machen. Aber ich kann es nicht schaffen ... :( –