multiple在datamapper中有1个关联

时间:2011-04-20 02:21:10

标签: associations datamapper model-associations

我不确定我想做的事情是错还是​​我的实施。

我想做的是

在一个人和地址之间有多个“有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`)
)

表结构对我来说并不重要,我想要的是家,办公室和邮件都是相同的对象类型,并且在同一个表中是完全相同的。能够分配相同的地址实例来说明家庭和邮件并且只在地址中存储一次但引用两次会很好。

P.S。人和地址不是它们作为熟悉的例子使用的实际底层对象。

编辑:我可以通过在地址上放置4个n关联来做我想要的。我会尝试用结果编辑我的答案。

1 个答案:

答案 0 :(得分: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