我正在尝试在我的Game
和DLC
模型之间创建一个简单的has_many
关联。我面临的挑战是,由于单个表继承而没有DLC
表,因此无法插入game_id
。因此,如果我要执行以下操作,则会出现此错误:
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 是指可下载的内容
替代方法是仅使用自连接并向games
添加parent_id
列。
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: :game_extensions
end
class DLC < Game
has_many :game_extensions
belongs_to :game, though: :game_extensions
end
编辑:
这个答案是基于对原始问题的误解。OP已经澄清了Download
指的是DLC
,事实上是STI的一个不错的案例。
我无意逆向,但我不确定在这种情况下使用单表继承的情况。当两个模型在数据库列方面非常相似,但在应用程序的上下文中明显不同时,最好使用单表继承。
例如,名为 Cow
和 Horse
的假设模型可能会共享farm_animals
表。您甚至可以Stallion
Horse
的子类。这将使您将所有这些模型放在一张桌子上,同时为您提供诸如 Stallion.new
等方法的便利,这实际上只是 FarmAnimal.new(type: 'horse', gender: 'male')
的缩写。
我不清楚这里对Game
和Download
之间的关系是否有同样的好处。如果我错过了一些重要的东西,并且用这个答案提供了无用的信息,我谦虚地道歉!否则,我建议在这种情况下重新评估STI的使用。