2011-07-17 8 views
0

単一のオブジェクトまたはコレクションのいずれかを取る汎用メソッドを作成してから、idの配列とオブジェクト/コレクションもパラメータとして渡されます。単一のオブジェクトまたはコレクションからIDを取得する一般的なメソッド

例:

a = [] 
a << get_ids("car_id", some_object) 
a << get_ids("user_id", some_collection) 


def self.get_ids(id_name, obj) 
    # ?? 
end 

これは私が知っているメタプログラミングを必要としますが、私はそのコレクション場合やないかを把握できますか? "id_name"がプロパティであるかどうかを確認するメッセージを送信しますか?

また、私は現在このタイプの機能が必要なので、一般的なものにして再利用できると考えました。パフォーマンスに大きな影響を与えますか?

答えて

2
def self.get_ids(id_name, obj) 
    if obj.is_a? Enumerable 
    obj.collect {|e| e.send(id_name) } 
    else 
    obj.send(id_name) 
    end 
end 

また、

def self.get_ids(id_name, *objs) 
    objs.collect {|e| e.send(id_name) } 
end 
... 
a << get_ids("car_id", some_object) 
a << get_ids("user_id", *some_collection) 
+0

は*あなたが複数のオブジェクトを入力することができますということですか? – Blankman

+0

はい、[これを読んでください](http://endofline.wordpress.com/2011/01/21/the-strange-ruby-splat/)。 – jtbandes

+0

+1しかし、 'obj'がEnumerableで、' id_name'を理解すればどうでしょうか?この点については疑問があいまいです。 –

関連する問題