无头Rails,存储哈希的简单方法?

时间:2013-04-03 21:04:29

标签: ruby-on-rails ruby model controller rails-activerecord

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

  1. 是否存在以下存储到SQL数据库中的rails方式?我把它放在模型或控制器中吗?
  2. 是否有一种干净的方式来存储这些数据,或者我是否必须单独在此哈希中明确存储每个属性?
  3. 我已经手动完成了迁移,这些迁移与下面的大多数散列数据相匹配,但有没有一个工具可以将这些散列转换为关系数据模型?
  4. {
    "_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" : ""
    

    }

2 个答案:

答案 0 :(得分:0)

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

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

def address_components=(ac)
  # Handle address components
end

如果您执行以下操作,则会调用此方法(假设您的模型名称为MyModel,并且哈希值存储在@hash中)。

MyModel.new(@hash)

所有键都会触发结构'key ='的setter方法。这非常强大 - 如果你有一个非常结构化的模型,但有一个任意的哈希,你可以创建处理哈希中的键的方法。基于这些,您可以构建新对象,构建关联并同时保存所有对象。

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

答案 1 :(得分:0)

  1. 此数据结构可以通过匹配的模型/关联层次结构进行存储。
  2. 有一种非常干净的方式......
  3. 使用accepts_nested_attributes_for。对于包含简单字符串列表的“types”数组,这将适用于之外的整个结构。但是,您可以针对此特定情况使用解决方法。
  4. 唯一无法存储(轻松)的是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)