在 rails 中使用与单个表继承模型的has_many关联



我正在尝试在我的GameDLC模型之间创建一个简单的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的一个不错的案例。

我无意逆向,但我不确定在这种情况下使用单表继承的情况。当两个模型在数据库列方面非常相似,但在应用程序的上下文中明显不同时,最好使用单表继承。

例如,名为 CowHorse 的假设模型可能会共享farm_animals表。您甚至可以Stallion Horse的子类。这将使您将所有这些模型放在一张桌子上,同时为您提供诸如 Stallion.new 等方法的便利,这实际上只是 FarmAnimal.new(type: 'horse', gender: 'male') 的缩写。

我不清楚这里对GameDownload之间的关系是否有同样的好处。如果我错过了一些重要的东西,并且用这个答案提供了无用的信息,我谦虚地道歉!否则,我建议在这种情况下重新评估STI的使用。

相关内容

最新更新