首页 > 解决方案 > 使用 map 构建哈希

问题描述

我有一个 Active Record 结果,并希望为 HIghCharts 图表返回一个简单的数据集,如下所示:

https://www.highcharts.com/demo/pie-basic

数据是一个简单的哈希:

[{
            name: 'Chrome',
            y: 61.41,
         }, {
            name: 'Internet Explorer',
            y: 11.84
        }, {
            name: 'Firefox',
            y: 10.85
        }, {
            name: 'Edge',
            y: 4.67
        }, {
            name: 'Safari',
            y: 4.18
        }, {
            name: 'Sogou Explorer',
            y: 1.64
        }, {
            name: 'Opera',
            y: 1.6
        }, {
            name: 'QQ',
            y: 1.2
        }, {
            name: 'Other',
            y: 2.61
        }]

我如何使用 .map (即 Record.all.map { |r| etc...} 来输出这个?

我自己尝试了几次,结构都被破坏了,输出包括 html 编码的引号等字符。

这是我到目前为止所拥有的:

@vendors.map { |v|  { name: v.name, y: v.expenditures.invoices.sum(&:amount).to_f } }

这吐出来:

    [
{:name=>"ABC Ltd.", :y=>13382.0},
{:name=>"EFG Inc", :y=>0.0},
{:name=>"ZWY Ltd.", :y=>0.0},
{:name=>"Apple", :y=>21539.4},
{:name=>"Microsoft", :y=>0.0},
{:name=>"Amazon", :y=>12345.0}
]

散列具有 :key=>'data' 格式,但所有 html 都已转义。

标签: ruby-on-railsruby

解决方案


我假设您的records表包含这些属性name, x, y, sliced, selected

如果是这种情况,您可以通过执行以下代码片段来生成描述数据集:

Record.all.map do |record|
  record.attributes.symbolize_keys.slice(:name, :x, :y, :sliced, :selected).compact
end

以下是代码的解释:

  • attributes从哈希模式中返回属性列表,每个键都是一个字符串
  • symbolize_keys将每个键从字符串转换为符号
  • slice只选择必要的键
  • compact删除具有nil值的键。

推荐阅读