2011-04-20 39 views
2

我不确定我想要做的是错误的还是只是我的实现。多个在datamapper中有1个关联

我想要做的就是

有多个“具有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 

但是当我保存然后ret从数据库ireve它不起作用。它混合了家庭,办公和邮件地址

我希望得到一个结构类似

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关联到地址来做我想要的。我会尝试编辑我的答案和结果。

回答

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 
+0

是这个工作。这对我来说是非常直观的,这个人属于地址,但它完美地工作。谢谢 – 2011-04-21 02:06:39

+0

谢谢!我在想和@GrantM一样的东西,这看起来完全倒退了...... – Jason 2012-12-06 23:17:11