创建具有多个值的哈希,Ruby和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

我正在使用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",
  "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:-)这只适用于所有输入哈希具有不同名称的情况(顺便说一句,包括您的和我的版本)。否则,必须将输出哈希值设置为将值哈希推送到的数组。