【问题标题】:Rails generating JSON ObjectRails 生成 JSON 对象
【发布时间】:2015-10-05 15:00:56
【问题描述】:

我想在从数据库中获取数据时生成一个 JSON 对象。

def duration
  return @data[:duration] unless @data[:duration].nil?

  @data[:duration] = per_hour.collect do | val |
    [val[0], val[1]]
  end
end

我得到了我需要的数据,但数组不正确。我的观点如下:

var array = <%= raw @duration_data.to_json %>;

我的数组看起来像这样:

var array = [{"data": [[0,0],[1,60.0]] }];

但我需要的是这个:

var array = [{"data": {"0":0, "1":60.0} }];

【问题讨论】:

    标签: javascript jquery ruby-on-rails ruby json


    【解决方案1】:

    您只需要将数组转换为哈希:

    @data[:duration] = per_hour.collect do |val|
      [val[0], val[1]]
    end.to_h
    

    对于 Ruby 1.9:

    @data[:duration] = Hash[*per_hour.collect { |val| [val[0], val[1]] }]
    

    【讨论】:

    • 谢谢,但我得到了这个错误 undefined method `to_h' for [[0, 3]]:Array
    • 你可能有一个旧的Ruby版本,我会更正答案
    • 不,我正在使用 rails 2.1
    • 这个和rails没有关系,你需要检查你的ruby版本。您可以通过在控制台中输入 ruby --version 在项目根目录中执行此操作
    【解决方案2】:
    @data[:duration] ||= per_hour.collect { | val | [val[0], val[1]] }.to_h
    

    试试这个。

    【讨论】:

    • 我收到了这个错误:未定义的方法 `to_h' for [[0, 3]]:Array
    • 这应该返回 pry(main)&gt; [[0, 3]].to_h =&gt; {0=&gt;3}
    【解决方案3】:

    我会这样写:

    def duration
      @data[:duration] ||= build_duration
    end 
    

    这是一种简短的说法:如果不是 nil,则返回 @data[:duration],否则,将 build_duration 分配给它。

    然后你定义build_duration

    def build_duration
      result = {}
      per_hour.each do |val|
        result[val[0]] = val[1]
      end
      result
    end
    

    您可以将build_duration 写得更紧凑,但对我来说这是非常易读的:它会构建一个哈希并按照您的意愿填充它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-30
      • 2020-06-08
      • 1970-01-01
      • 2011-02-26
      • 2016-06-09
      • 2020-08-15
      相关资源
      最近更新 更多