我正在为激战 2 开发 Rails 5 应用程序,我正在尝试找出一种方法来序列化和存储游戏中的所有项目,而无需复制代码或表列。该游戏有一个公共(public) API 可以从中获取项目,记录在案 这里:https://wiki.guildwars2.com/wiki/API:2/items
如您所见,所有项目都共享多个数据,例如 ID、值(value)、稀有度等,但随后还会根据其类型分割为特定的详细信息。
我一直在四处寻找解决方案,并且找到了一些答案,但没有一个适用于这种特定情况。
- 单表继承:项目之间差异太大。 STI 最终可能会得到一个超过 100 列宽的表格,其中大部分为空。
- 多态关联:看起来真的不是使用它们的正确方法。我不是要创建一种包含多个其他位置的模型,我只是想扩展我的“项目”模型的数据。
- 多表继承:在我看来,这是完美的解决方案。它会做我想要的。不幸的是,ActiveRecord 不支持这一点,而且我发现的所有“解决方法”看起来都很古怪。
基本上,我想要的是一个带有公共(public)列的单个“项目”模型,然后是一个“详细信息”属性,该属性将从相关表中获取特定于类型的数据。
创建此架构的最佳方式是什么?
最佳答案
一种可能的解决方案: 在详细信息(文本)列上使用#serialize
class Item
serialize :details, Hash
end
一个巨大的缺点是,如果您需要查询详细信息数据,这是非常低效的。这基本上绕过了数据库的 native 抽象。
关于ruby-on-rails - 具有公共(public)列的多种类型对象的 ActiveRecord 模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44480980/