在 rails 中使用 has_many 与单个 table 继承模型的关联
Using a has_many association with a single table inheritance model in rails
我正在尝试在我的 Game
和 DLC
模型之间创建一个简单的 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 继承。
例如,名为 Cow
和 Horse
的假设模型可能共享 farm_animals
table。您甚至可以使 Stallion
成为 Horse
的子类。这将使您可以将所有这些模型保留在一个 table 上,同时为您提供 Stallion.new
等方法的便利,这实际上只是 FarmAnimal.new(type: 'horse', gender: 'male')
.
的缩写
我不清楚 Game
和 Download
之间的关系是否存在相同的好处。如果我错过了一些重要的事情,并且在这个答案中提供了无用的信息,我深表歉意!否则,我建议在这种情况下重新评估 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
我正在尝试在我的 Game
和 DLC
模型之间创建一个简单的 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 继承。
例如,名为 Cow
和 Horse
的假设模型可能共享 farm_animals
table。您甚至可以使 Stallion
成为 Horse
的子类。这将使您可以将所有这些模型保留在一个 table 上,同时为您提供 Stallion.new
等方法的便利,这实际上只是 FarmAnimal.new(type: 'horse', gender: 'male')
.
我不清楚 Game
和 Download
之间的关系是否存在相同的好处。如果我错过了一些重要的事情,并且在这个答案中提供了无用的信息,我深表歉意!否则,我建议在这种情况下重新评估 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