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

Using a has_many association with a single table inheritance model in rails

我正在尝试在我的 GameDLC 模型之间创建一个简单的 has_many 关联。我面临的挑战是,由于没有 DLC table,因为只有 table 继承,所以无法插入 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指downloadable content

编辑: 这个答案是基于对原始问题的误解。 OP 已澄清 Download 指的是 DLC,实际上是 STI 的一个不错的案例。

我无意逆势而行,但我不确定在这种情况下是否适合使用单 table 继承。当两个模型在数据库列方面极其相似,但在应用程序的上下文中明显不同时,最好使用单一 table 继承。

例如,

名为 CowHorse 的假设模型可能共享 farm_animals table。您甚至可以使 Stallion 成为 Horse 的子类。这将使您可以将所有这些模型保留在一个 table 上,同时为您提供 Stallion.new 等方法的便利,这实际上只是 FarmAnimal.new(type: 'horse', gender: 'male').

的缩写

我不清楚 GameDownload 之间的关系是否存在相同的好处。如果我错过了一些重要的事情,并且在这个答案中提供了无用的信息,我深表歉意!否则,我建议在这种情况下重新评估 STI 的使用。

最简单的替代方法是仅使用自联接并将 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

如果这绝对不可想象,您可以创建一个连接 table。

# 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