2011-01-20 6 views
0

私のモデルの1つにupsertメソッドを書きました。私はすべてのモデルにこのアップサートメソッドを持たせたいと思います。論理的な解決策は、ActiveRecord::Baseから継承したモデルを定義し、それから他のすべてのモデルを継承することでした。しかし、もし私がそれを行うと、Railsは、私が作成した新しいモデルには、それに付随するテーブルがないことに不満を持ちます。しかし、私は気にしません。すべてのRailsモデルを特定のクラスから継承させる

私が試した方法は明らかに正しい方法ではないので、それを行う正しい方法は何ですか?

答えて

6

ActiveRecordをモジュールで拡張することができます。 ActiveRecordを継承するすべてのモデルでアクセス可能になります。

module YourModule 
    def self.included(recipient) 
    recipient.extend(ModelClassMethods) 
    recipient.class_eval do 
     include ModelInstanceMethods 
    end 
    end # #included directives 

    # Class Methods 
    module ModelClassMethods 
    # A method accessible on model classes 
    def whatever 

    end 
    end 

    # Instance Methods 
    module ModelInstanceMethods 
    #A method accessible on model instances 
    def another_one 

    end 
    end 
end 

#This is where your module is being included into ActiveRecord 
if Object.const_defined?("ActiveRecord") 
    ActiveRecord::Base.send(:include, YourModule) 
end 
+0

ワウ!これはクールだ。私はそれを試していないが、それが動作すると確信しています!これは私の+1です。 –

+0

はい、モジュールはここに行く方法です。 – jschorr

3

これを行うには2通りの方法があります。

1)それ用のテーブルを作成する必要があります(つまり、抽象クラス)あなたは

class YourAbstractClass < ActiveRecord::Base 
    self.abstract_class = true 

    # rest of class code 
end 

2を設定しなければならない親モデルを持っていますが、ないようにするには)あなたがから含まれていることを、module方法を入れて

0

このメソッドをモジュールに移動し、そのメソッドを必要とするすべてのモデルにそのモジュールを含めることができます。あなたが使用している場合

私はこれが私のアプリ モジュールUtilsの のlibフォルダにモジュールをutilsの持っているように...

def to_name(ref) 
     ref.gsub('_', ' ').split.collect { |w| w.capitalize }.join(' ') 
    end 

    ... 
end 

はその後、私のモデルでは、私は、おそらく

class MyModel < AR::Base 
    include Utils 
    ... 
end 

を言いますRails 3では、application.rbを設定してlibフォルダにファイルをロードする必要があります。

config.autoload_paths += %W(#{config.root}/lib) 
関連する問題