Ruby中的数组和哈希迭代 - Rails

时间:2014-06-03 22:26:51

标签: ruby-on-rails ruby ruby-on-rails-3

params'哈希键是camelcase,小写和大写字符的混合:

params = {"RefreshTime"=>"0", "lang"=>"tr", "amount"=>"50", "ACQBIN"=>"490740"}

数组是我的某个模型的列名称列表,全部是小写但使用参数的键完全相同的值哈希=>

columns = ["refreshtime", "lang", "amount", "acqbin", ......]

我正在尝试将哈希键与数组成员匹配,以便在我的控制器中创建一条新记录=>

def create_transaction
   @transaction = OrderTransaction.new(
      params.each do |k, v|
        columns.each do |i|
          if i == k.downcase
            "#{i}: params[:#{k}],"
          end
        end
      end
    )
end

但是这段代码没有像我预期的那样工作。好像我在做错了;

#{i}: #{v}

我在这里缺少什么?

顺便说一句,这是我以前做这项工作的方法,这导致了很多行代码=>

@transaction = OrderTransaction.new(
  refreshtime: params[:RefreshTime],
  lang: params[:lang],
  amount: params[:amount],
  acqbin: params[:ACQBIN],
  ...
)

4 个答案:

答案 0 :(得分:3)

你可以做这样的事情

@transaction = OrderTransaction.new(Hash[params.map{|k,v|[k.downcase,v]}])

这将创建一个包含所有小写键的新哈希,并使用它来初始化OrderTransaction。

仅包含出现在列数组中的键

@transaction = OrderTransaction.new(Hash[params.map{|k,v|[k.downcase,v]}.select{|k,v|columns.include?(k)}])

答案 1 :(得分:0)

您没有创建哈希条目,而是创建了一个字符串。

我建议......

eval "#{i}: params[:#{k}],"

希望实际创建键值对。

或者就此而言,为什么不......

i.to_sym => params[k.to_sym]

答案 2 :(得分:0)

我建议采用更简洁的方法:

def create_transaction
    result_hash = {}
    params.each do |k,v|
        temp = k.to_s.downcase
        if columns.include? temp
            result_hash[temp] = v
        end
    end
    @transaction = OrderTransaction.new(result_hash)
end

答案 3 :(得分:0)

通常我们会创建一个映射哈希。从:

开始
params = {"RefreshTime"=>"0", "lang"=>"tr", "amount"=>"50", "ACQBIN"=>"490740"}

如果你知道地图是一致的,这是一种快速的方法:

cols_to_key = Hash[params.keys.map(&:downcase).zip(params.keys)]
# => {"refreshtime"=>"RefreshTime",
#     "lang"=>"lang",
#     "amount"=>"amount",
#     "acqbin"=>"ACQBIN"}

或者:

cols_to_key = params.keys.map(&:downcase).zip(params.keys).to_h
# => {"refreshtime"=>"RefreshTime",
#     "lang"=>"lang",
#     "amount"=>"amount",
#     "acqbin"=>"ACQBIN"}

访问值如下:

params[cols_to_key['refreshtime']] # => "0"
params[cols_to_key['lang']] # => "tr"

您甚至可以通过各种方式对params哈希进行切片。如果你想要一切:

params.values_at(*cols_to_key.values)
# => ["0", "tr", "50", "490740"]

如果你想要一些东西:

params.values_at(*cols_to_key.values_at('amount', 'acqbin'))
# => ["50", "490740"]