我是rails的新手,但大多数文档都是针对用户在视图中输入内容而最终传递到数据库中。
{
"_id" : "36483f88e04d6dcb60684a33000791a6bc522a41",
"address_components" : [
{
"long_name" : "ON",
"short_name" : "ON",
"types" : [
"administrative_area_level_1",
"political"
]
},
{
"long_name" : "CA",
"short_name" : "CA",
"types" : [
"country",
"political"
]
},
{
"long_name" : "M5J 1L4",
"short_name" : "M5J 1L4",
"types" : [
"postal_code"
]
}
],
"formatted_address" : "ON, Canada",
"formatted_phone_number" : "(416) 362-5221",
"geometry" : {
"location" : {
"lat" : 43.640816,
"lng" : -79.381752
}
},
"icon" : "http://maps.gstatic.com/mapfiles/place_api/icons/restaurant-71.png",
"id" : "36483f88e04d6dcb60684a33000791a6bc522a41",
"international_phone_number" : "+1 416-362-5221",
"name" : "Scandinavian Airlines",
"reference" : "CoQBcgAAAMobbidhAbzwIMkxq3GTHzzlEW4hAAwxg5EmGDP7ZOcJRwUK29poFMTDvED5KW9UEQrqtgTwESj_DuCAchy6Qe5pPZH9tB47MmmuQHvyHFlApunmU3MN05_KLekN5hEbrW7Gv2ys2oXmn7FpvD7-0N0QILlFXCiwL5UlYWo2sEg3EhBMBsrkHBu4WCFsMCHRqgadGhTM3BVWR15l9L87zL1uN1ssoW4WCw",
"types" : [
"restaurant",
"food",
"establishment"
],
"url" : "https://plus.google.com/100786723768255083253/about?hl=en-US",
"utc_offset" : -300,
"vicinity" : ""
}
答案 0 :(得分:0)
如果您的模型上有setter方法,他们可以处理数据并根据需要从此哈希导入。
例如,给定上面的哈希,如果你有一个方法:
def address_components=(ac)
# Handle address components
end
如果您执行以下操作,则会调用此方法(假设您的模型名称为MyModel,并且哈希值存储在@hash中)。
MyModel.new(@hash)
所有键都会触发结构'key ='的setter方法。这非常强大 - 如果你有一个非常结构化的模型,但有一个任意的哈希,你可以创建处理哈希中的键的方法。基于这些,您可以构建新对象,构建关联并同时保存所有对象。
注意 - 您可能需要删除一些键,或者以自定义方式处理一些使用保留ruby术语的键。
答案 1 :(得分:0)
accepts_nested_attributes_for
。对于包含简单字符串列表的“types”数组,这将适用于除之外的整个结构。但是,您可以针对此特定情况使用解决方法。唯一无法存储(轻松)的是id
。 ActiveRecord不允许您直接设置id
,因为它应该是后备数据库的实现细节。在您的情况下,您可以简单地借用似乎包含相同数据的_id
字段,并将其插入某种别名中。
以下是您可能使用的代码示例:
class Address < ActiveRecord::Base
has_many :address_components
has_many :address_types
has_one :geometry
attr_accessor :address_components_attributes, :geometry_attributes
accepts_nested_attributes_for :address_components, :geometry
def types=(types)
types.each do |t|
self.address_types << AddressType.build(name: t)
end
end
def _id=(orig_id)
self.original_id = orig_id
end
end
class AddressType < ActiveRecord::Base
belongs_to :address
end
class Geometry < ActiveRecord::Base
belongs_to :address
has_one :location
attr_accessor :location_attributes
accepts_nested_attributes_for :location
end
class Location < ActiveRecord::Base
belongs_to :geometry
end
class AddressComponent < ActiveRecord::Base
belongs_to :address
has_many :component_types
def types=(types)
types.each do |t|
self.component_types << ComponentType.build(name: t)
end
end
end
class ComponentType < ActiveRecord::Base
belongs_to :address_component
end
现在您可以使用以下方式存储整个结构:
Address.create(data_hash)