使用rails(4),我想从外部API解析一些数据并将其存储到我的数据库中。例如:
{ "name" : "Mercedes-Benz",
"commonName: "Mercedes",
"vehicles" : [ {
"name" : "Mercedes c5",
"components" : ["wheels", "doors"]
}]
}
我知道使用JSON.parse
我可以创建一个新实例并在json匹配时存储它,但是有一些问题阻止我这样做:
commonName
使用cammelcase而不是rails典型的下划线。有没有办法可以神奇地为一个属性分配一个键?
vehicles
会保存到表格vehicles
吗?我可以自动完成吗?或者我应该检查每辆车并保存每辆车吗?
组件只是一个字符串数组。什么是代表它的好方法?只是另一个属性为name
的表?
答案 0 :(得分:2)
是的,如果您希望能够查找components
,那么将其作为单独的表格是有意义的。它需要vehicle_id
以及name
。
接受vehicles
和components
使用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)