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

Ruby on rails Ruby-Rails中的数组和哈希迭代,ruby-on-rails,ruby,ruby-on-rails-3,Ruby On Rails,Ruby,Ruby On Rails 3,参数“散列键是大小写字符的混合: params = {"RefreshTime"=>"0", "lang"=>"tr", "amount"=>"50", "ACQBIN"=>"490740"} 数组是我的一个模型列名的列表,虽然都是小写,但与参数哈希=> columns = ["refreshtime", "lang", "amount", "acqbin", ......] 我正在尝试将哈希键与数组成员匹配,以便在我的控制器=> def create_transac

参数“散列键是大小写字符的混合:

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],
  ...
)

您不是在创建散列条目,而是在创建字符串

我建议

eval "#{i}: params[:#{k}],"
希望它能真正创建键值对

或者就这件事而言,为什么不

i.to_sym => params[k.to_sym]

您不是在创建散列条目,而是在创建字符串

我建议

eval "#{i}: params[:#{k}],"
希望它能真正创建键值对

或者就这件事而言,为什么不

i.to_sym => params[k.to_sym]

您不是在创建散列条目,而是在创建字符串

我建议

eval "#{i}: params[:#{k}],"
希望它能真正创建键值对

或者就这件事而言,为什么不

i.to_sym => params[k.to_sym]

您不是在创建散列条目,而是在创建字符串

我建议

eval "#{i}: params[:#{k}],"
希望它能真正创建键值对

或者就这件事而言,为什么不

i.to_sym => params[k.to_sym]

你可以这样做

@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)}])

你可以这样做

@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)}])

你可以这样做

@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)}])

你可以这样做

@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)}])

我建议一种更干净的方法:

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

我建议一种更干净的方法:

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

我建议一种更干净的方法:

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

我建议一种更干净的方法:

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

通常我们会创建一个映射哈希。首先是:

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"}
或:

访问值如下所示:

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"]

通常我们会创建一个映射哈希。首先是:

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"}
或:

访问值如下所示:

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"]

通常我们会创建一个映射哈希。首先是:

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"}
或:

访问值如下所示:

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"]

通常我们会创建一个映射哈希。首先是:

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"}
或:

访问值如下所示:

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"]


那句话本身毫无意义。你需要对它做些什么,比如将key/val添加到散列或其他东西。@DaveNewton编辑了那一行,我正试图对那一行中的
amount:params[:amount]
做同样的事情。你确定
k
字符串而不是
符号吗?它应该是符号,但如何做呢?如果它是符号,然后我认为,
I==k
在任何情况下都是不正确的,这一行本身是没有意义的。你需要对它做些什么,比如将key/val添加到散列或其他东西。@DaveNewton编辑了那一行,我正试图对那一行中的
amount:params[:amount]
做同样的事情。你确定
k
字符串而不是
符号吗?它应该是符号,但如何做呢?如果它是符号,然后我认为,
I==k
在任何情况下都是不正确的,这一行本身是没有意义的。你需要对它做些什么,比如将key/val添加到散列或其他东西。@DaveNewton编辑了那一行,我正试图对那一行中的
amount:params[:amount]
做同样的事情。你确定
k
字符串而不是
符号吗?它应该是符号,但如何做呢?如果它是符号,然后我认为,
I==k
在任何情况下都是不正确的,这一行本身是没有意义的。你需要对它做些什么,比如将key/val添加到散列或其他东西。@DaveNewton编辑了那一行,我正试图对那一行中的
amount:params[:amount]
做同样的事情。你确定
k
字符串而不是
符号吗?它应该是符号,但如何做呢?如果它是符号,然后我认为,
I==k
在任何情况下都是不正确的。这很酷!唯一的问题是参数键列表比我的数组大得多。只有散列中的一些参数将保存到我的数据库中。我该怎么做?我更新了我的答案来告诉你怎么做。这将只包括列数组中出现的键。
Hash[params.map{k,v{k.downcase,v]}]。切片(“foo”,“bar”)
以筛选出除“foo”和“bar”之外的键值对。然后,您可以使用splat操作符执行
Hash[params.map{{k,v}[k.downcase,v]}].slice(*columns)
1个las