やりたいことが間違っているのか、それとも自分の実装だけなのかわかりません。
私がやりたいのは
人と住所の間に複数の「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を設定することで、やりたいことができるかもしれません。結果を使って答えを編集してみます。