2013-06-11 49 views
2

我很新的DataMapper,我試圖創建以下情形型號:一比一的DataMapper協會

我有多個用戶(使用用戶名,密碼等等),他們也可以是球員或裁判或兩者(因此單表繼承不是一種選擇)。基本模型將是:

class User 
    include DataMapper::Resource 
    property :id, Serial 
    # Other user properties go here 
end 

class Player 
    include DataMapper::Resource 
    property :id, Serial 
    # Other player properties go here 
    # Some kind of association goes here 
end 

class Referee 
    include DataMapper::Resource 
    property :id, Serial 
    # Other referee properties go here 
    # Some kind of association goes here 
end 

DataMapper.finalize 

我不確定,但是,什麼類型的關聯添加到播放器和裁判。使用belongs_to :user,多位玩家可以與同一位用戶關聯,這在我的上下文中沒有意義。在RDBMS術語中,我想我想要的是對玩家和裁判表中外鍵的唯一約束。

如何在我的DataMapper模型中完成此操作?我必須在驗證中自己執行檢查嗎?

回答

5

有不同的方法可以做到這一點。這裏有一個選項:對裁判/播放模式

class User 
    include DataMapper::Resource 
    property :id, Serial 
    # Other properties... 
    has 1, :referee, :required => false 
    has 1, :player, :required => false 
end 

class Referee 
    include DataMapper::Resource 
    # DON'T include "property :id, Serial" here 
    # Other properties... 
    belongs_to :user, :key => true 
end 
class Player 
    include DataMapper::Resource 
    # DON'T include "property :id, Serial" here 
    # Other properties... 
    belongs_to :user, :key => true 
end 

法,如:

u = User.create(...) 
u.referee = Referee.create(...) 
u.player = Player.create(...) 

u.player.kick_ball() # or whatever you want to call 
u.player.homeruns 
u.referee.flag_play() # or whatever. 

見,如果這個工程。我沒有真正測試過,但它應該很好。

+0

感謝您的回答。不過,這些模型仍然允許我創建與同一用戶相關聯的多個玩家。 – mwittrock

+0

@mwittrock我明白了。編輯,以防止這一點。現在,「子類」使用用戶外鍵作爲其主鍵。 – AlexQueue

+0

這似乎是DataMapper中正確的一對多關聯。享受聲譽的幫助:-) – mwittrock

0

以前的答案除:required => false之外的其他作品不能識別has 1屬性。

這也令人困惑,因爲對於has n屬性,您可以在屬性上使用new或將其作爲集合處理。在你的榜樣,你會受到誘惑,編碼

u = User.create ... 
u.referee.create ... 

但在has 1的情況下失敗,因爲該屬性是一個單值,它開始生活nil,所以你必須使用以前的回答表明,該方法。而且,不得不明確地將關聯關係變爲關鍵字有點令人困惑。

它似乎執行驗證並擁有正確的關聯操作(所以u.save也會保存提到的Referee)。我只是希望它在has nhas 1之間更一致。