2011-04-20 72 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