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