2

やりたいことが間違っているのか、それとも自分の実装だけなのかわかりません。

私がやりたいのは

人と住所の間に複数の「has1」関係がある

私のモデルは

class Person
  include DataMapper::Resource

  property id,serial
  property name,String

  has 1, :home, :model => 'Address'
  has 1, :office, :model => 'Address'
  has 1, :mail, :model => 'Address'
end

class Address
 include DataMapper::Resource
 property :id,Serial 
 property addr1, String
 property country, String
end

これはコードで正常に機能し、人の国を割り当ててアクセスできます

a_person.home.country

しかし、保存してからDBを終了すると、機能しません。自宅、オフィス、メールアドレスが混同されます

私は次のような構造を手に入れたいと思っていました

CREATE TABLE `addresses` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `addr1` varchar(50) DEFAULT NULL,
  `country` varchar(50) DEFAULT NULL,
  PRIMARY KEY (`id`)
)

CREATE TABLE `persons` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(50) DEFAULT NULL,
  'home' int(10) unsigned ,
  'office' int(10) unsigned ,
  'mail' int(10) unsigned ,
  PRIMARY KEY (`id`)
) 

私が得たのは

CREATE TABLE `addresses` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `addr1` varchar(50) DEFAULT NULL,
  `country` varchar(50) DEFAULT NULL,
  `person_id` int(10) unsigned NOT NULL,
  PRIMARY KEY (`id`),
  KEY `index_addresses_person` (`person`)
)

CREATE TABLE `persons` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(50) DEFAULT NULL,
  PRIMARY KEY (`id`)
)

テーブルの構造は私にとって重要ではありません。私が欲しいのは、自宅、オフィス、メールがすべて同じオブジェクトタイプであり、おそらく同じテーブルにあることです。同じAddressインスタンスを、自宅とメールの両方に割り当てて、アドレスに1回だけ保存し、2回参照できるようにすると便利です。

PSの人と住所は、おなじみの例として使用されている実際の基になるオブジェクトではありません。

編集:アドレスに4 has n assocを設定することで、やりたいことができるかもしれません。結果を使って答えを編集してみます。

4

1 に答える 1

4

実際には、次のようなものが必要になる場合があります。

class Person
  include DataMapper::Resource

  property :id, Serial
  property :name, String

  belongs_to :home,   :model => Address
  belongs_to :office, :model => Address, :required => false
  belongs_to :mail,   :model => Address, :required => false
end

class Address
  include DataMapper::Resource

  property :id,Serial 
  property :address, String
  property :country, String
end
于 2011-04-20T22:31:54.877 に答える