解析嵌套的JSON并使用rails将其保存到数据库中

时间:2015-02-13 17:01:48

标签: ruby-on-rails ruby json parsing ruby-on-rails-4

使用rails(4),我想从外部API解析一些数据并将其存储到我的数据库中。例如:

{ "name" : "Mercedes-Benz",
  "commonName: "Mercedes",
  "vehicles" : [ {
    "name" :  "Mercedes c5",
    "components" : ["wheels", "doors"]
  }]
}

我知道使用JSON.parse我可以创建一个新实例并在json匹配时存储它,但是有一些问题阻止我这样做:

  • commonName使用cammelcase而不是rails典型的下划线。有没有办法可以神奇地为一个属性分配一个键?

  • vehicles会保存到表格vehicles吗?我可以自动完成吗?或者我应该检查每辆车并保存每辆车吗?

  • 组件只是一个字符串数组。什么是代表它的好方法?只是另一个属性为name的表?

1 个答案:

答案 0 :(得分:2)

是的,如果您希望能够查找components,那么将其作为单独的表格是有意义的。它需要vehicle_id以及name

接受vehiclescomponents使用accepts_nested_attributes_for的属性。

所以你的模型应该是这样的:

class VehicleType < ActiveRecord::Base
  has_many :vehicles

  accepts_nested_attributes_for :vehicles
end

class Vehicle < ActiveRecord::Base
  belongs_to :vehicle_type      
  has_many :components

  accepts_nested_attributes_for :components
end

class Component < ActiveRecord::Base
  belongs_to :vehicle
end

为了将commonName(camelCase)转换为common_name(蛇案例),这里有一个很棒的Stack Overflow答案:Converting nested hash keys from CamelCase to snake_case in Ruby。所以假设你已经定义了那里描述的函数(convert_hash_keys)和上面的模型,你的代码应该大致如下:

converted_hash = convert_hash_keys(JSON.parse(input_json_string))
vehicle_type = VehicleType.create(converted_hash)

如需更新,则为VehicleType.update(converted_hash)