创建具有多个值的哈希,Ruby和Mysql2 gem
我正在使用mysql2 gem连接到我的数据库并提取数据。这是一个简单的查询创建具有多个值的哈希,Ruby和Mysql2 gem,ruby,hash,Ruby,Hash,我正在使用mysql2 gem连接到我的数据库并提取数据。这是一个简单的查询 statement = @db.prepare('SELECT * FROM my_table') @result = statement.execute 这将返回一个Mysql2::Result对象,我知道在执行此操作时需要迭代 @result.each do |r| puts r end 在我的情况下会有回报的 [ {"id"=>1, "name"=>"Standard", "lab
statement = @db.prepare('SELECT * FROM my_table')
@result = statement.execute
这将返回一个Mysql2::Result
对象,我知道在执行此操作时需要迭代
@result.each do |r|
puts r
end
在我的情况下会有回报的
[
{"id"=>1,
"name"=>"Standard",
"label"=>"Standard",
"amount"=>100,
"created_at"=>2010-11-17 11:50:38 +0000,
"updated_at"=>2010-11-17 11:50:38 +0000,
"status"=>"active",
"dataprofileid"=>"0",
"groupid"=>1},
{"id"=>2,
"name"=>"Director Register",
"label"=>"Director Register",
"amount"=>150,
"created_at"=>2010-11-17 11:51:11 +0000,
"updated_at"=>2010-11-17 11:51:11 +0000,
"status"=>"active",
"dataprofileid"=>"18",
"groupid"=>0}
]
根据这个,我想创建一个如下所示的散列
{ "Standard"=> { "id"=>1, "dataprofileid"=> 0 }}
因此,对于每个记录,使用名称
作为键,然后在其中包含更多的键/值。目前,我已经创建了一个常规散列,其中name
作为键,id
作为值,但不确定如何进入下一阶段
@credit_ids = []
@credit_names = []
@credit_dataprof = []
@result.each do |r|
@credit_names << r['name']
@credit_ids << r['id']
@credit_dataprof << r['dataprofileid']
end
@credit_hash = Hash[@credit_names.zip @credit_ids]
@credit\u id=[]
@信用卡名称=[]
@信用证_dataprof=[]
@结果:每个do | r|
@信用证名称
将数组映射到实际需要作为值的哈希值
使用
这将允许您按名称获取所有哈希值,下面是完整的哈希值
或者我没听清你的问题。:) 我在SO上遇到了另一个答案,并提出了这个有效的答案,希望它能帮助其他人
h = Hash.new{|hsh, key| hsh[key] = {} }
@result.each do |r|
h[r['name']].store 'id', r['id']
h[r['name']].store 'dataprofileid', r['dataprofileid']
end
然后返回
{
"Standard"=> { "id" => 1, "dataprofileid" => "0" },
"CCJ" => { "id" => 5, "dataprofileid" => "20" }
# Many more ommitted but you get the idea
}
敞开心扉接受建议,改善这一点天真的人:
@result.map{
|h| {h["name"] => {"id" => h["id"], "dataprorileid" => h["dataprofileid"]}}
}
将为您提供:
[
{"Standard"=>{"id"=>1, "dataprorileid"=>"0"}},
{"Director Register"=>{"id"=>2, "dataprorileid"=>"18"}}
]
[
{"Standard"=>{"id"=>1, "name"=>"Standard", "label"=>"Standard", "amount"=>100, "created_at"=>2016-01-14 20:47:04 +0900, "updated_at"=>2016-01-14 20:47:04 +0900, "status"=>"active", "dataprofileid"=>"0", "groupid"=>1}},
{"Director Register"=>{"id"=>2, "name"=>"Director Register", "label"=>"Director Register", "amount"=>150, "created_at"=>2016-01-14 20:47:04 +0900, "updated_at"=>2016-01-14 20:47:04 +0900, "status"=>"active", "dataprofileid"=>"18", "groupid"=>0}}
]
但如果您希望尊重原始结构(保留除“name”
之外的键值对),则:
将为您提供:
[
{"Standard"=>{"id"=>1, "dataprorileid"=>"0"}},
{"Director Register"=>{"id"=>2, "dataprorileid"=>"18"}}
]
[
{"Standard"=>{"id"=>1, "name"=>"Standard", "label"=>"Standard", "amount"=>100, "created_at"=>2016-01-14 20:47:04 +0900, "updated_at"=>2016-01-14 20:47:04 +0900, "status"=>"active", "dataprofileid"=>"0", "groupid"=>1}},
{"Director Register"=>{"id"=>2, "name"=>"Director Register", "label"=>"Director Register", "amount"=>150, "created_at"=>2016-01-14 20:47:04 +0900, "updated_at"=>2016-01-14 20:47:04 +0900, "status"=>"active", "dataprofileid"=>"18", "groupid"=>0}}
]
产生:
{"Standard"=>{"id"=>1, "dataprofileid"=>"0"}, "Director Register"=>{"id"=>2, "dataprofileid"=>"18"}}
谢谢,我想我到了那里,发布了一个答案,除非有更干净的方法或者result=hash.inject({})do | output,input | output[input.first.name]=input.slice('id','dataprofileid');输出端
对于一个单循环/一行程序。ooooo@muichkine:-)这只适用于所有输入哈希具有不同名称的情况(顺便说一句,包括您的和我的版本)。否则,必须将输出哈希值设置为将值哈希推送到的数组。