Я не уверен, что то, что я хочу сделать, неправильно или просто моя реализация.
что я хочу сделать, это
иметь несколько «имеет 1» отношения между человеком и адресами
мои модели
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
но когда я сохраняю и удаляюсь из БД, это не работает. Он смешивает адреса дома, офиса и почты
Я надеялся получить такую структуру, как
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, например, home и mail, и хранить его только один раз в адресах, но ссылаться на него дважды.
P.S. люди и адреса не являются фактическим базовым объектом, они просто используются в качестве знакомого примера.
Редактировать: Возможно, я смогу сделать то, что я хочу, поставив 4 имеет n ассоциированных на адрес. Я постараюсь изменить свой ответ с результатами.