0

我有以下三種模式...如何基於屬性值建立模型之間的關係?

球員

id:integer 
first_name:string 
last_name:string 

學校

id:integer 
short_name:string 
long_name:string 

SchoolRosterSlot

id:integer 
season:integer 
jersey:string 
position:string 
active:boolean 

最初我將在球員模型中存儲球衣,位置,school_id。然而,我改變了這種想法,因爲我認爲將這些信息輸入到玩家模型中是多餘的,並且將其插入到SchoolRosterSlot模型中,因爲我想將玩家的季節信息存儲起來。 (球員的位置,球衣和學校都可以從賽季到賽季改變)。

我的問題是如何設置我的關聯,以便我可以通過@player.school訪問玩家的學校?或@player.jersey ...還是建立學校和玩家之間的直接聯繫並插入名冊插槽記錄更好?即使這會記錄兩次信息?

回答

1

一般而言,您希望儘可能避免存儲重複信息。

你可以嘗試添加school_roster_slot_id到播放器和school_id到SchoolRosterSlot,然後加入到這個模型:

class SchoolRosterSlot 
    belongs_to :school 
end 

class Player 
    belongs_to :school_roster_slot 
    has_one :school, through: :school_roster:slot 
end 

這將創建一個player.school方法。如果你想也得到player.jerseyplayer.position你也可以將它添加到播放器:

delegate :position, :jersey, to :school_roster_slot 

這實際上是與創建以下兩種方法:

def jersey 
    school_roster_slot.jersey 
end 

def position 
    school_roster_slot.position 
end 

我不知道,如果你想要存儲關於玩家位置和球衣的歷史信息(例如,當玩家改變位置和球衣,你還想存儲關於他們以前的位置的信息嗎?),但是如果是這種情況,你可能需要做一些事情來創建一個額外的模型稱爲Season,位於之間和SchoolRosterSlot。或者,也許你可以添加start_dateend_dateSchoolRosterSlot來表示玩傢什麼時候開始並離開那個位置?

+0

謝謝!我即將跳回到這一點,看看我能否得到這個工作。是的,我確實希望存儲每個賽季的歷史信息,例如學校,球衣和位置。這是有點讓我從這裏扔掉。我在考慮製作一個SchoolRosterHistorical,它會在新的SchoolRosterSlot賽季進入時插入一條記錄。但是這種方法似乎也有一些潛在的問題。 – daveomcd 2014-10-12 14:32:10

+0

是否可以向'has_one:school'關聯添加條件語句?所以我會按季節順序排列玩家的記錄,然後限制查詢返回1。這樣我會得到最近一個賽季的紀錄? – daveomcd 2014-10-15 15:14:55

相關問題