2010-11-29 3 views
1

同じ機能が必要な2つのモデルがあります。 、以来Railsの2つのモデルで機能する関数を作成する

def assign_uuid 
    if self.uuid.nil? 
     self.uuid = ActiveSupport::SecureRandom.hex(32) 
    end 
    end 

:各モデルであり

before_save :assign_uuid 

:私は私が持っている両方のモデルについては

...これは右のレールの道を乾燥させる方法を学びたいのですがassign_uuidは両方のモデルに住んでいますが、このfuncを配置する場所はどこですか?また、モデルでは、それはbefore_saveと言います。 assign_uuidは、どの場所にあるのですか?これをモジュールとして追加し、モデルにそれを混ぜる必要があり

おかげ

答えて

4

私はRubyの専門家ではないので、これが悩んでいるかどうかはわかりませんが、もし私があなただったら、のlib/のファイルでチャックし、ActiveRecord :: class_evalのベース。

ActiveRecord::Base.class_eval do 
    def assign_uuid 
    if self.uuid.nil? 
     self.uuid = ActiveSupport::SecureRandom.hex(32) 
    end 
    end 
end 

こうして、すべてのモデルで使用できます。そのどちらか、またはその他のモデルヘルパーファイルを作成して、あなたが望むモデルにモジュールを含めてください。

# lib/misc_model_helpers.rb 
module MiscModelHelpers 
    def assign_uuid 
    if self.uuid.nil? 
     self.uuid = ActiveSupport::SecureRandom.hex(32) 
    end 
    end 
end 

# models/person.rb 
class Person < ActiveRecord::Base 
    include MiscModelHelpers 
    before_save :assign_uuid 
end 

もう一度、私は本当にこれを行う最もルビーの方法ではありません。それはおそらく全く異なるものです。これらは私のために働くちょうど2つの方法です!あなたのlibフォルダで

+1

私はどちらも受け入れ可能であり、それは事件に依存すると思います。すべてのモデルに機能を追加する必要がある場合は、ActiveRecord :: Baseを再度開きます。一方、モジュールを含むことも明示的であり、イホを理解するのがより明確である。 – nathanvda

+1

ありがとう、これは素晴らしいです。私はたくさん学んだ – AnApprentice

+0

あなたは大歓迎です!そしてありがとう、それは知って良いです。 –

-1

、それはあなたが後にしている何をすべきかRubyの方法です。

+0

モジュールとして追加しますか?私のモデルをどのようにミックス? – AnApprentice

1

は、ファイルuuid_lib.rbを追加し、

module UuidLib 

    def assign_uuid 
    if self.uuid.nil? 
     self.uuid = ActiveSupport::SecureRandom.hex(32) 
    end 
    end 
end 

を書いて、あなたのモデル内でより詳細にモジュールとミックスインを説明する例の記事はhereを見つけることができます

include UuidLib 

before_save :assign_uuid 

書きます。

関連する問題