如何创建设置为数组中字符串的动态变量名称

时间:2017-12-29 02:54:00

标签: ruby

我想干掉我的一些代码。

我有一个字符串数组,代表我稍后需要在我的代码中调用的方法。

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的问题有所不同,因为在存在的示例中,想要动态创建变量的人只是将字符串值设置为哈希值,我需要将变量设置为方法。

1 个答案:

答案 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