2017-12-29 6 views
1

私のコードを一部解凍したいと思います。配列内の文字列に設定された動的変数名を作るにはどうすればいいですか?

私はコードで後で呼び出す必要があるメソッドを表す文字列の配列を持っています。

stages = ['prospecting', 'development', 'submitted', 'committed', 'review'] 

現在、私はまた、私は明示的に配列内の各値に等しい命名しています5つのメソッドを持ってい

# returns a hash 
prospecting = ElasticSearch::Job.query(
    stage: 'prospecting', 
    titan_user_id: titan_user['id'], 
    gte: start_date, 
    lte: end_date 
) 

# . . . 

# returns a hash 
review = ElasticSearch::Job.query(
    stage: 'review', 
    titan_user_id: titan_user['id'], 
    gte: start_date, 
    lte: end_date 
) 

私はステージアレイ上stages.eachを行うと、各文字列を設定したいと思います変数名を動的に変更します。

stages.each do |stage| 
    [stage] = ElasticSearch::Job.query(
    stage: stage, 
    titan_user_id: titan_user['id'], 
    gte: start_date, 
    lte: end_date 
) 
end 
# . . . 

後で、このようになります。何か私のコードで私は

# . . . 
snapshot.prospecting_bids = prospecting['aggregations']['total_count']['value'] 
snapshot.prospecting_value = prospecting['aggregations']['total_sum']['value'] 
snapshot.development_bids = development['aggregations']['total_count']['value'] 
snapshot.development_value = development['aggregations']['total_sum']['value'] 
snapshot.save 

...のようなものをやってますが私を可能にするRubyでVariable.new = 'name'のいくつかの並べ替えがあります私の配列を動的にループして変数名を設定するには?

私の質問は、変数を動的に作成したい人が存在する例では、単に文字列値をハッシュに設定するだけなので、変数としてメソッドを設定する必要があるため、StackOverflowに関する以前の質問とは異なります。

+0

可能な複製(https://stackoverflow.com/questions/4963678/dynamically -set-local-variables-in-ruby) –

答えて

2

それはハッシュまたはオープン構造体を使用することをお勧めでしょう:あなたはqueriesへの参照を名前空間に必要があります

require 'ostruct' 
queries = stages.each_with_object(OpenStruct.new) do |stage, struct| 
    struct[stage] = ElasticSearch::Job.query(
    stage: stage, 
    titan_user_id: titan_user['id'], 
    gte: start_date, 
    lte: end_date 
) 
end 

snapshot.prospecting_bids = queries.prospecting['aggregations']['total_count']['value'] 

しかし、それはあなたの擬似コードと非常によく似ていて、回避メタプログラミングは、方法をより簡単に理解できるようにする。

あなたが名前空間を避けたかった場合、あなたはミニDSLを作ることができますが:[Rubyで動的に設定されたローカル変数]の

queries.instance_eval do 
    snapshot.prospecting_bids = prospecting['aggregations']['total_count']['value'] 
end 
関連する問題