具有公共列的多种类型对象的ActiveRecord模式?

时间:2017-06-11 06:24:03

标签: ruby-on-rails ruby postgresql activerecord

我正在使用Rails 5应用程序进行激战2,我试图想出一种方法来序列化和存储游戏中的所有项目,而无需复制代码或表格列。该游戏有一个公共API来获取项目,记录  在这里:https://wiki.guildwars2.com/wiki/API:2/items

正如您所看到的,所有项目共享多个数据,如ID,值,稀有度等,但随后也会根据其类型分为具体细节。

我一直在寻找解决方案,而且我找到了一些答案,但没有一个能够解决这个问题。

  • 单表继承:项目之间的差异太大了。 STI最终可能会有一个超过100列宽的表,其中大多数都是空的。
  • 多态关联:实际上似乎并不是使用这些关联的正确方法。我没有尝试创建一种包含多个其他地方的模型,我只想扩展我的"项目"模型。
  • 多表继承:这对我来说就像是一个完美的解决方案。它会完全符合我的要求。不幸的是,ActiveRecord不支持这一点,以及所有的"变通方法"我发现它看起来很丑陋和奇怪。

基本上,我想要的只是一个" Item"使用公共列的模型,然后是"详细信息"将从相关表中获取特定于类型的数据的属性。

创建此架构的最佳方法是什么?

2 个答案:

答案 0 :(得分:0)

一种可能的解决方案: 在详细信息(文本)列上使用#serialize

class Item
 serialize :details, Hash
end

一个巨大的缺点是,如果您需要查询详细信息数据,这是非常低效的。这基本上绕过了数据库的本机抽象。

答案 1 :(得分:0)

我最近处于类似情况。我用Sequel而不是ActiveRecords解决了。 你可以在这里找到它: https://github.com/TalentBox/sequel-rails 一个实例: http://www.matchingnotes.com/class-table-inheritance-in-rails.html 祝你好运