2011-01-24 7 views
0

私はスタッフテーブルにいくつかの項目があるとしましょう。名前は: RedBaloon、SmallBall、BigShoe、ShoeStringファインダーメソッドのメタプログラミング

私は私のためにfind_by_nameメソッドを作成するためにメタプログラミングを使いたいと思っています。 red_baloon、small_ball、big_shoe、シューストリング

NB:「靴ひも」はタイプミスではない私がいる

問題は、私はメソッドの名前として、以下のものを使用してしたいということです。

は、ここで私はあなたに応答するのを始め、いくつかのコードです:彼らのコメントで言っ@apneadiving同様

class Stuff < ActiveRecord::Base 

    NAMES = ['RedBaloon', 'SmallBall', 'BigShoe', 'ShoeString'] 
    validates_inclusion_of :name, :in => NAMES 

    class << self 
     NAMES.each do |n| 
      define_method "#{n}" do 
       find_by_kind(n) 
      end 
     end 
    end 

end 
+0

あなたはメタプログラミングの概念を理解しており、良いスタートがあるようです。あなたは何かをする方法やエラーが出るようなことについて具体的な質問がありますか? –

+0

別の配列にメソッド名を取得します。あなたがダウンケースに突っ込んでいたら。あなたはそれに答えるアンダースコアメソッドhttp://apidock.com/rails/String/underscore – apneadiving

+0

を使用することができました!答えとして追加する – keruilin

答えて

0

、あなたの場合は、特別なString#underscoreメソッドを使用します。ここで私はあなたのコードをクリーンアップする方法を次のとおりです。

class Stuff < ActiveRecord::Base 
    NAMES = ['RedBaloon', 'SmallBall', 'BigShoe', 'Shoestring'] 
    validates_inclusion_of :name, :in => NAMES 

    class << self 
    NAMES.each do |name| 
     define_method name.underscore do 
     find_by_kind name 
     end 
    end 
    end 
end 

他の問題がある場合、私はvalidates_inclusion_ofの良いドキュメントを見つけることができなかったので、私は知りませんが、私は、これはあなたの問題を修正だと思います。

また、文字列を同じ文字列()に挿入する必要はなく、これらのメソッドで文字列と記号の両方が有効な名前であるため、変換。それでも、#to_stringを使用してください。

関連する問題