あなたのニーズに応じて、私があなたがこれで行くのを見ることができるいくつかの方法があります。私はこれらのどれにも完全には満足していませんが、おそらく彼らはあなたを正しい方向に向けることができます:
- すべてをシリアル化
Railsは任意のオブジェクトをバイトストリームとして格納でき、Rubyではすべてがオブジェクトです。したがって、理論的には、Strings、DateTimes、さらには独自のモデルを含む任意のオブジェクトの文字列表現をデータベース列に格納できます。Marshalモジュールはほとんどの場合これを処理し、オブジェクトに特別なニーズがある場合は独自のシリアル化メソッドを作成できます。
長所:実際には、すべてを1つのデータベース列に格納します。
短所:データベース内のデータを操作する機能は最小限です-この列をストレージ以外の目的で使用することは基本的に不可能です-フォーマットが機能しないため、(おそらく)それに基づいてデータを並べ替えたりフィルタリングしたりすることはできません。データベースが認識するものであれば何でもかまいません。
- すべてのデータ型の列
これは基本的に、質問で提案した解決策です。つまり、保存する必要のあるデータ型を正確に把握します。文字列と日付スタンプについて言及します。それらの数が多すぎない場合は、各タイプの列を作成し、そのうちの1つにのみデータを格納することをお勧めします。属性アクセサ関数をオーバーライドして適切な列を使用できます。外部からは、Featureは.value
必要なものであるかのように動作します。
長所:必要なテーブルは1つだけです。
短所:すべてのレコードに少なくとも1つのnull値。
- 複数のモデル/テーブル
TextFeature、DateFeatureなど、必要になる可能性のある機能の種類ごとにモデルを作成できます。複数テーブル継承に関するこのガイドでは、アイデアと方法論について説明します。
長所:null値はありません-すべてのレコードには、必要な列のみが含まれています。
短所:複雑さ。複数のモデルが必要なことに加えて、データベース内のさまざまな種類の機能を直接操作する必要がある場合は、複雑な結合と結合を実行していることに気付く場合があります。