0

これを使用してデータベースから取得したハッシュのこの形式がありますEntity.where('source_id is not null').select([:system_id, :source_id, :name]).group_by(&:system_id)

{6=>
  [#<Obj name: "Lease", system_id: 6, source_id: "369">,
   #<Obj name: "Docks", system_id: 6, source_id: "864">,
   #<Obj name: "Marinas", system_id: 6, source_id: "1630">,
   #<Obj name: "Transporters", system_id: 6, source_id: "229">,
   #<Obj name: "Stations", system_id: 6, source_id: "83258">,
   #<Obj name: "Stations", system_id: 6, source_id: "2407">,
  ]}

私はこれを最終結果として持ちたい:

{6=> 
  {"369" => "Lease", "864" => "Docks", "1630" => "Marinas", "229" => "Transporters", "83258" => "Stations", "2407" => "Stations"} 
}

または :

{6=> 
  {"369" => #<Obj name: "Lease", system_id: 6, source_id: "369">, "864" => #<Obj name: "Docks", system_id: 6, source_id: "864">, "1630" => #<Obj name: "Marinas", system_id: 6, source_id: "1630">, "229" => #<Obj name: "Transporters", system_id: 6, source_id: "229">, "83258" => #<Obj name: "Stations", system_id: 6, source_id: "83258">, "2407" => #<Obj name: "Stations", system_id: 6, source_id: "2407">} 
}

どちらが生産しやすいか。基本的に、オブジェクトの配列を、キー source_id と、obj 名またはオブジェクト全体のいずれかの値を持つハッシュに置き換えたいと考えています。

私はもう試した :

.each{|c_id, c| new_format = {c_id => {c.source_id => c} } }
NoMethodError: undefined method `source_id' for #<Array:0xb4bc4e4>

.each{|c_id, c| new_format = {c_id => c.group_by(&:source_id) } }
NameError: undefined local variable or method `new_format' for main:Object

他にもいくつかのオプションがありますが、正しい結果を得ることができませんでした。これどうやってするの?

4

2 に答える 2

0
 # records is the hash returned by dbquery
 records.map{|k,v| records[k] = v.inject({}) {|hsh,obj| hsh[obj.source_id] = obj.name;hsh } }

これにより、recordsハッシュが目的の形式に変更されます。

于 2013-09-19T09:43:47.897 に答える
0

どうですか

top_hash.each { |key, array|
  top_hash[key] = array.each_with_object({}) { |obj, hash|
    hash[obj.source_id] = obj.name
  }
}
于 2013-09-19T09:43:59.200 に答える