0

我是 Rails 的新手,但大多数文档都是针对用户在视图中输入内容并最终传递到数据库中的。

  1. 是否有一种将以下存储到 SQL 数据库中的 Rails 方式?我把它放在模型或控制器中吗?
  2. 有没有一种干净的方法来存储这些数据,或者我必须单独显式地存储这个 Hash 中的每个属性?
  3. 我已经手动进行了与下面大多数(如果不是全部)散列数据匹配的迁移,但是是否有可以将这些散列转换为关系数据模型的工具?

.

{
"_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" : ""

}

4

2 回答 2

0

如果您的模型上有 setter 方法,它们可以根据需要处理数据并从此哈希导入。

例如,给定上面的哈希,如果你有一个方法:

def address_components=(ac)
  # Handle address components
end

如果您执行以下操作(假设您的模型的名称是 MyModel 并且哈希存储在 @hash 中),它将被调用。

MyModel.new(@hash)

所有的键都会触发结构'key='的setter方法。这是非常强大的——如果你有一个结构很好的模型,但是有一个任意的散列,你可以创建处理散列中的键的方法。基于这些,您可以同时构建新对象、建立关联并保存它们。

注意 - 您可能需要删除一些键,或以自定义方式处理一些使用保留 ruby​​ 术语的键。

于 2013-04-03T21:31:27.773 回答
0
  1. 该数据结构可以通过模型/关联的匹配层次结构来存储。
  2. 有一种非常干净的方法是......
  3. 使用accepts_nested_attributes_for. 这将适用于您的整个结构,除了包含简单字符串列表的“类型”数组。但是,您可以针对这种特定情况使用解决方法。

唯一不能(容易)存储的是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)
于 2013-04-04T02:33:22.607 回答