データベースに永続化する必要があるが、適切なモデルではないデータを Ruby on Rails で処理するにはどうすればよいですか?
-
02-07-2019 - |
質問
Ruby on Rails で書かれた Web アプリケーションを想像してください。そのアプリケーションの状態の一部は、モデルの説明に適合しないデータで表されます。この状態記述子は、モデルと同じデータベースに保存する必要があります。モデルと異なる点は、クラスのインスタンスが 1 つだけ必要であり、他のクラスとの関係がないことです。
誰かがこのようなものに遭遇したことがありますか?
解決
あなたの説明から、rails-settings プラグインが必要なことを行う必要があると思います。
Readme より:
「Settings は、グローバル キーと値のペアのテーブルの管理を簡単にするプラグインです。これは、操作に単純な ActiveRecord のようなメソッドを使用する、データベースに保存されるグローバル ハッシュのようなものだと考えてください。Rails アプリにハードコーディングしたくないグローバル設定を追跡します。あらゆる種類のオブジェクトを保存できます。文字列、数値、配列、または任意のオブジェクト。」
他のヒント
それがデータであり、データベース内にある場合、それはモデルの一部です。
これは実際には RoR の問題ではありません。これは一般的な OO 設計の問題です。
私だったら、おそらくデータをモデルとして概念化し、それをファクトリ メソッドとプライベート コンストラクターでシングルトンにする方法を見つけるでしょう。
あるいは、これをロギングの一種と考えることもできます。その場合、データベースを直接読み書きし、各リクエストの最初と最後に呼び出される Logger クラス (シングルトンでもあります) が必要になります。
Rails では、データがデータベース内にある場合、それはモデル内にあります。この場合、モデルは「構成」と呼ばれますが、Rails システムの ActiveRecord クラスにマップされています。
このデータが本当に静的である場合、データベースはまったく必要ない可能性があります。(例として) アプリケーション コントローラーで変数を使用できます。
class ApplicationController < ActionController::Base
helper :all
@data = "YOUR DATA HERE"
end
Rails アプリケーションで使用するデータをインスタンス化するために使用できるアプローチは多数あります。
なぜRailsモデルに適合しないと言うのか理解できません。
単なる複雑なデータ構造の場合は、データベースのテキスト フィールドに大量の Ruby コードを保存するだけです :-)
たとえば、複雑なネストされたハッシュを保存したい場合は、「データ」テキスト フィールドに次の内容を割り当てます。
ComplexThing.data = complex_hash.inspect
読み返したいときは、
complex_hash = eval ComplexThing.data
このソリューションについてさらに 2 つの点を指摘させてください。
- データ構造が標準の Ruby クラスではない場合、単純な検査では検査できない可能性があります。どこかに #<MyClass:0x4066e3c> が表示される場合は、何かが正しくシリアル化されていません。
- これは単純な実装です。Unicode データを保持する危険性がある場合、または実際に大量のカスタムメイドのクラスを保存している場合は、実際のマーシャリング ソリューションをチェックしてみるとよいでしょう。