我想干掉我的一些代码。
我有一个字符串数组,代表我稍后需要在我的代码中调用的方法。
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 :(得分:2)
使用哈希或开放结构更好:
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
您需要将对queries
的引用命名空间:
snapshot.prospecting_bids = queries.prospecting['aggregations']['total_count']['value']
但它与你的伪代码非常相似,并且避免元编程使得该方法更容易理解。
如果你想避免使用命名空间,你可以制作一个mini-dsl:
queries.instance_eval do
snapshot.prospecting_bids = prospecting['aggregations']['total_count']['value']
end