0

私はレールに慣れていませんが、ほとんどのドキュメントはユーザーがビューに何かを入力するためのものであり、最終的にデータベースに渡されます。

  1. 以下をSQLデータベースに格納するレールの方法はありますか? モデルまたはコントローラーに入れますか?
  2. このデータをきれいに保存する方法はありますか、またはこのハッシュのすべての属性を個別に明示的に保存する必要がありますか?
  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
  1. このデータ構造は、モデル/関連付けの一致する階層によって格納できます。
  2. 非常にきれいな方法があります...
  3. を使用しaccepts_nested_attributes_forます。これは、文字列の単純なリストを含む「types」配列を除いて、構造全体で機能します。ただし、この特定のケースでは回避策を使用できます。

(簡単に)保存できないのはid. idActiveRecordでは、バッキング データベースの実装の詳細であると想定されているため、直接設定することはできません。あなたの場合、_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 に答える
0

モデルにセッター メソッドがある場合、それらはデータを処理し、必要に応じてこのハッシュからインポートできます。

たとえば、上記のハッシュが与えられた場合、メソッドがある場合:

def address_components=(ac)
  # Handle address components
end

これは、次の場合に呼び出されます (モデルの名前が MyModel で、ハッシュが @hash に格納されていると仮定します)。

MyModel.new(@hash)

すべてのキーは、構造体「key=」のセッター メソッドをトリガーします。これは非常に強力です。非常によく構造化されたモデルがあり、任意のハッシュがある場合、ハッシュ内のキーを処理するメソッドを作成できます。これらに基づいて、新しいオブジェクトを作成し、関連付けを作成し、すべてを同時に保存できます。

注 - 一部のキーを削除するか、独自の方法で予約済みの Ruby 用語を使用する一部のキーを処理する必要がある場合があります。

于 2013-04-03T21:31:27.773 に答える