2017-06-11 14 views
1

私はGuild Wars 2用のRails 5アプリケーションを開発しています。コードやテーブルの列を複製せずに、ゲーム内のすべてのアイテムをシリアル化して保存する方法を見つけようとしています。ゲームにはアイテムを入手するための公開APIがあります。 ここにはhttps://wiki.guildwars2.com/wiki/API:2/items共通の列を持つ複数のタイプのオブジェクトのActiveRecordスキーマ

などがあります。ご覧のとおり、すべてのアイテムはID、値、希少性などのいくつかのデータを共有していますが、それらのタイプに基づいた特定の詳細。

私は解決策を探していましたが、私はいくつかの答えを見つけましたが、この特定の状況ではうまくいきませんでした。

  • 単一テーブル継承:アイテム間の分散が大きすぎます。 STIはおそらく100列幅以上のテーブルに終わるでしょう。大部分はヌルです。
  • 多型関連:本当にこれらを使用する適切な方法ではないようです。私は複数の他の場所に含まれるモデルの型を作成しようとしているわけではありません、私は単に "アイテム"モデルのデータを拡張したいと思います。
  • 複数のテーブル継承:これは完璧なソリューションのようです。それは私が欲しがっているものとまったく同じです。残念ながら、ActiveRecordはこれをサポートしておらず、私が見つけたすべての「回避策」はハッキリと変わっているようです。

基本的には、共通の列を持つ単一の「アイテム」モデル、関連するテーブルから型固有のデータをフェッチする「詳細」属性です。

このスキーマを作成する最適な方法は何ですか?

答えて

0

一つの可能​​な解決策:詳細について 使用#serialize(テ​​キスト)列

class Item 
serialize :details, Hash 
end 

一つの巨大な欠点あなたが詳細データを照会する必要がある場合、これは非常に非効率的であるということです。これは基本的にデータベースのネイティブな抽象化をバイパスします。

+0

をあなたはPostgresのを使用している場合は、 'details'ためJSONB列を使用することができ、それが照会可能、かつ非常に高速になります。 – dphaener

関連する問題