Ruby on rails 对象作为JSON,列作为键
我有一个Rate对象,包含date、Rate和iso_code列。 我想要这样的输出: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_
{
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[…]
将上一步中的数组转换为我们想要的哈希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_代码,则结果散列中将只显示最后一个。)
我推测第一种方法的效率比其他两种方法稍低,因为它分配了以后必须进行垃圾收集的所有数组。谢谢!这正是我要找的!