несколько имеет 1 ассоциаций в datamapper - PullRequest
2 голосов
/ 20 апреля 2011

Я не уверен, что то, что я хочу сделать, неправильно или просто моя реализация.

что я хочу сделать, это

иметь несколько «имеет 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 ассоциированных на адрес. Я постараюсь изменить свой ответ с результатами.

1 Ответ

4 голосов
/ 21 апреля 2011

На самом деле вы можете захотеть что-то вроде этого:

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
...