2015-06-20 25 views
1

我正嘗試在我的GameDLC模型之間創建一個簡單的has_many關聯。我面臨的挑戰是,由於單表繼承沒有DLC表,因此無法插入game_id。所以,如果我是做到以下幾點我會得到這個錯誤:在rails中使用has_many與單個表繼承模型的關聯

game = Game.create 
game.dlcs 

SQLite3::SQLException: no such column: games.game_id 

這裏是我的模型如何目前設置:

class Game < ActiveRecord::Base 
    has_many :dlcs 
end 

class DLC < Game 
    belongs_to :game 
end 

注: DLC指downloadable content

+0

爲什麼它是多態的? – Swards

+0

說實話,我不完全確定在這種情況下。我只是在嘗試我在之前的回答中看到的任何內容。 –

+0

您是否閱讀過關聯的Rails指南? http://guides.rubyonrails.org/association_basics.html – 7stud

回答

2

最簡單的選擇是隻使用自連接並將parent_id列添加到games

class Game < ActiveRecord::Base 
    has_many :dlcs unless self.name == 'DLC' 
end 

class DLC < Game 
    belongs_to :game, foreign_key: :parent_id 
end 

如果這絕對不可想象,您可以創建一個連接表。

# game_id: int 
# dlc_id: int 
class GameExtension 
    belongs_to :game 
    belongs_to :dlc 
end 

class Game < ActiveRecord::Base 
    has_many :game_extensions 
    has_many :dlcs, though: :GameExtension 
end 

class DLC < Game 
    has_many :game_extensions 
    belongs_to :game, though: :GameExtension 
end 
2

編輯:這個答案是基於對原始問題的誤解。 OP已澄清,Download是指DLC,事實上STI是一個體面的案例。

這不是我的意圖是逆轉,但我不確定我看到在這種情況下使用單表繼承的情況。單表繼承最適用於兩個模型在數據庫列方面極其相似的情況,但在應用程序上下文中略有不同。

例如,名爲CowHorse的假設型號可能共享farm_animals表。你甚至可以使Stallion成爲Horse的一個子類。這可以讓您將所有這些模型保留在一張桌子上,同時爲您提供方便的方法,如Stallion.new,這實際上只是FarmAnimal.new(type: 'horse', gender: 'male')的縮寫。

我不清楚這裏的GameDownload之間的關係。如果我錯過了一些關鍵的東西,並且正在用這個答案提供無用的信息,我謙卑的道歉!否則,我建議在這種情況下重新評估STI的使用。

+0

您是否熟悉術語DLC(可下載的內容)?將其視爲視頻遊戲的擴展包。因此,比如像「生化奇兵」這樣的遊戲就是一個核心標題,但是還有一個名爲「埋葬在海上」的擴展DLC。 DLC繼承了遊戲中的所有屬性(標題,成就,藝術盒等)。我不確定Rails是否會正確地知道如何複製DLC,這就是爲什麼我將模型命名爲Download的原因。現在有道理嗎? –

+0

啊,那*確實有道理!讓我考慮一下,看看我能否改進我的答案。 – rossettistone

+0

我想maxcal已經在你的問題的評論中註明了它。這對自我加入來說是一個很好的例子,他鏈接的文檔只是正確的:http://guides.rubyonrails.org/association_basics.html#self-joins。我以前沒有見過與STI的自我加入,但我不明白爲什麼它不起作用! – rossettistone