2012-04-25 11 views
0

method_missingメソッドを記述しようとしています。メソッドを実行するときにハッシュをヒットし、値を返す一致が見つかった場合はキーを参照する必要があります。続けてください。ハッシュは、値が決して決して決してないように私が書いたSQLクエリから移入されます。Rails Method_missingでハッシュ値を返す

例はそう@month_idが、私は多くの素材としてハッシュを使用してそこに、前にそれではない働いたことはない1を返します

@month_id.number_of_white_envelopes_made 
ハッシュで

@data_hash[number_of_white_envelopes_made] => 1 

ようになりますメソッドが見つからないときに戻す

EDIT:申し訳ありませんが、ハッシュでメソッドが見つからない場合は、メソッドエラーが表示されないように忘れています。

EDIT:大丈夫ので、私は離れてハッキングされ、これは私が

def method_missing(method) 
    if @data_hash.has_key? method.to_sym 
    return @data_hash[method] 
    else 
    super 
    end 
end 

が出ているものですが、より良い方法はありますか?

+2

方法[OpenStruct]使用について(http://www.ruby-doc.org/

class Hash def method_missing(sym,*) fetch(sym){fetch(sym.to_s){super}} end end 

ですstdlib-1.9.3/libdoc/ostruct/rdoc/OpenStruct.html)代わりに? 'OpenStruct'のインスタンスをハッシュから初期化し、その属性を' struct.attribute'構文を使って参照することができます。値がない場合、単に 'nil'を返しますが、そうでなければあなたのために働くかもしれません。 –

+1

@ KL-7 +1 OpenStructは、その下に 'method_missing'を使用します。 – steenslag

+0

問題は、あまりにも150のキーが近すぎるということですか?構造体を作成することで、より多くの作業が可能になります。私はそれがプレゼンターに配置されているので、メソッドがいくつかのメソッドが使用され、他のメソッドが使用され、使用されることがあります。そして、いったん欠落したメソッドが呼び出されるとメソッドが定義され、それはメモリ内に保存されていると呼ばれる時には – TheLegend

答えて

5

どうのようなものについて:

def method_missing(method_sym, *arguments, &block) 
    if @data_hash.include? method_sym 
    @data_hash[method_sym] 
    else 
    super 
    end 
end 

、常に対応するrespond_toを追加することを忘れないでください!あなたのオブジェクトへ:

def respond_to?(method_sym, include_private = false) 
    if @data_hash.include? method_sym 
    true 
    else 
    super 
    end 
end 
1

最短は最初hash[:key]を試み、次にhash["key"]

+0

私はそれが好きです:) – TheLegend

+0

よろしくお願いします!私はちょうどあなたがargs更新されたままにすることもできることを学んだ:) – akuhn

関連する問題