Ruby on rails 如何将哈希值作为字符串返回到
这是我的代码:Ruby on rails 如何将哈希值作为字符串返回到,ruby-on-rails,ruby,string,hash,Ruby On Rails,Ruby,String,Hash,这是我的代码: def return_rider_values(pol_option, pro_endorsement, prop_coverage, *par) rider_values par.each do |p| rider_values << RiderValue.find_all_by_rider_id(p) end rider_hash = { } rider_values.each do |rv| if rv.attribute
def return_rider_values(pol_option, pro_endorsement, prop_coverage, *par)
rider_values
par.each do |p|
rider_values << RiderValue.find_all_by_rider_id(p)
end
rider_hash = { }
rider_values.each do |rv|
if rv.attributes["name"].downcase == "yes"
rider_hash.merge!({par[0].to_s => rv.attributes['id'].to_s})
elsif rv.attributes["position"] == pol_option.to_i && rv.attributes["rider_id"] == par[1]
rider_hash.merge!({par[1].to_s => rv.attributes["id"].to_s})
elsif rv.attributes["position"] == prop_coverage.to_i && rv.attributes["rider_id"] == par[2]
rider_hash.merge!({par[2].to_s => rv.attributes["id"].to_s})
elsif rv.attributes["position"] == pro_endorsement.to_i && rv.attributes["rider_id"] == par[3]
rider_hash.merge!({par[3].to_s => rv.attributes["id"].to_s})
end
end
rider_hash
end
我期待着,而且显然需要,因为它在以后的生产线中不起作用:
rider_hash #=> '22' -> '58'
'23' -> '61'
'25' -> '66'
'26' -> '68'
我不知道为什么程序后面的lookup函数希望id是字符串而不是int。我只知道它确实如此,我不能改变它,因为很多其他方法都使用它
我在散列键和值上都有to_s
。我意识到在Ruby 1.9中,to_s是inspect
的别名,但即使在文档中,它也说,inspect或to_s
应该“以字符串形式返回此散列的内容”
那么,为什么只将密钥作为字符串返回?您有一个哈希数组,请尝试以下操作:
def return_rider_values
par = [1,2,3,6]
rider_hash = {}
rider_values = [element1: {:attributes => {:id => 1, :name => 'yes', :position => 1, :rider_id => 1}},
element2: {:attributes => {:id => 2, :name => 'no', :position => 2, :rider_id => 2}},
element3: {:attributes => {:id => 3, :name => 'something', :position => 1, :rider_id => 3}},
element4: {:attributes => {:id => 4, :name => 'something_else', :position => 2, :rider_id => 6}}]
rider_values.each_with_index do |hash, idx|
rider_values[idx].each_pair do |k, v|
if v[:attributes][:name].downcase == "yes"
rider_hash.merge!({par[0].to_s => v[:attributes][:id].to_s})
elsif v[:attributes][:position] == 2 && v[:attributes][:rider_id] == par[1]
rider_hash.merge!({par[1].to_s => v[:attributes][:id].to_s})
elsif v[:attributes][:position] == 3 && v[:attributes][:rider_id] == par[2]
rider_hash.merge!({par[2].to_s => v[:attributes][:id].to_s})
elsif v[:attributes][:position] == 4 && v[:attributes][:rider_id] == par[3]
rider_hash.merge!({par[3].to_s => v[:attributes][:id].to_s})
end
end
end
rider_hash
end
test = return_rider_values
puts test
输出:
#=>{“1”=>“1”,“2”=>“2”}
通过添加以下内容,我最终得到了想要的:
rider_hash.each{ |_,v| v.replace "'#{v}'"}
但不知何故,这似乎是一个肮脏的解决方案 我想知道,为什么要使用
merge代码>调用而不是附加项散列[par[0]。to_s]=rv.attributes['id']。to_s
?能否生成一个可运行的代码段来重现问题?到目前为止,我还不知道有什么问题。@SergioTulentsev有区别吗?我倾向于更明确,因为ruby不是我的第一语言(来自c++/java世界),好吧,merge
做同样的事情(在本例中),但它不是惯用的。我想,即使是Java人也会使用索引器。@SergioTulentsev-too-merider\u hash[par[0]。to\u s]=rv.attributes['id']。to\s
看起来像是array[at-index par[0]。to\u string]=某个字符串
,看起来像是用字符串作为索引,这很糟糕!
rider_hash.each{ |_,v| v.replace "'#{v}'"}