Ruby on rails 对象作为JSON,列作为键

Ruby on rails 对象作为JSON,列作为键,ruby-on-rails,ruby,json,Ruby On Rails,Ruby,Json,我有一个Rate对象,包含date、Rate和iso_code列。 我想要这样的输出: { EUR: { date: "2015-04-23", rate: 1.0772, btc_rate: 249.824 }, .... } Hash[Rate.all.map{|r| [r.iso_code, {date: r.date, rate: r.rate, btc_rate: r.btc_rate}]}] 但如果我这样做的话: Rate.all.map { |r| {r.iso_

我有一个Rate对象,包含date、Rate和iso_code列。 我想要这样的输出:

{
EUR: {
  date: "2015-04-23",
  rate: 1.0772,
  btc_rate: 249.824
 },
....
}
Hash[Rate.all.map{|r| [r.iso_code, {date: r.date, rate: r.rate, btc_rate: r.btc_rate}]}]
但如果我这样做的话:

Rate.all.map { |r| {r.iso_code => {date: r.date, rate: r.rate, btc_rate: r.btc_rate}} }
我所拥有的只是:

[
  {
   EUR: {
    date: "2015-04-23",
   rate: 1,
   btc_rate: 231.92
   }
 },
...
]

每个对象都在散列中。

您可以执行以下操作:

{
EUR: {
  date: "2015-04-23",
  rate: 1.0772,
  btc_rate: 249.824
 },
....
}
Hash[Rate.all.map{|r| [r.iso_code, {date: r.date, rate: r.rate, btc_rate: r.btc_rate}]}]
这项工作分为两部分:

  • Rate.all.map
    创建一个包含2个元素数组的数组。在每个小数组中,我们希望第一个元素是键,第二个元素是结果哈希中的值
  • Hash[…]
    将上一步中的数组转换为我们想要的哈希
  • 顺便说一下,我刚刚了解到,在ruby 2.0中,您可以使用
    array.to_h
    作为
    Hash[array]
    的一个更好的替代方法

    或者你可以尝试更“命令式”的风格:

    或者,您可以使用
    #inject
    ,简化(或复杂化,取决于您的观点)上述方法:

    Rate.all.inject({}) do |h, r|
      h[r.iso_code] = {date: r.date, rate: r.rate, btc_rate: r.btc_rate}
      h
    end
    
    (顺便说一句,在所有这些情况下,我假设每个速率都有不同的iso_代码。如果任何速率共享iso_代码,则结果散列中将只显示最后一个。)


    我推测第一种方法的效率比其他两种方法稍低,因为它分配了以后必须进行垃圾收集的所有数组。

    谢谢!这正是我要找的!