2016-09-16 4 views
0

比較的静的なデータを含む小さなテーブルがある場合、アクティブレコードにアプリの起動時にこのデータを読み込ませ、このデータのデータベースにアクセスする必要はありませんか?Rails 5 Active Record - テーブルをメモリに保持することは可能ですか?

このデータは、理想的には、このデータと関係のある他のモデルからの結合が可能であることを望みます。

たとえば、電話番号のプレフィックスを持つ国のリスト - このリストは変更されていない可能性があります。変更された場合、管理者によって変更されます。他のテーブルはこれとの関係を持っているかもしれません(例えば、国への参照を持つユーザーがあれば、国の電話のプレフィックスを検索したいかもしれません)。

私は同様の質問hereを見ましたが、6歳で、Rails 2を参照していますが、Rails 5を使用していて、その後何かが導入されている可能性があります。

好ましい溶液は次のようになります。

  1. 内蔵のRails/ActiveRecordの機能を一度起動時に、その他のレコードがその後にロードされるキャッシュされたテーブルと関係を持っている場合は、テーブルをロードするために、キャッシュされたにリンクオブジェクトを自動的に(つまり、MyModel.allをどこかに手動でキャッシュするだけでは、データベースへのクエリによって関係がロードされるため、十分ではありません)。
  2. 上記を行うライブラリです。
  3. どちらも利用できない場合は、静的データセットをメモリ内の列挙型またはハッシュまたは同様のものとして定義し、このデータとの関係を持つレコードにハッシュキーを保持し、これらのモデルは、データベースに保持されているキーを使用してハッシュ内のオブジェクトを使用して検索します。これは

[EDIT] もうひとつは、潜在的な解決策を検討して...しかし、非常にマニュアルらしい - マニュアルソリューションは、(3)また、APIを介してアクセスするカスタムコントローラと、このようなデータのルートを必要とします。理想的には、あまりにも多くの手作業を必要とせずに、足場のような標準的なレール機構を使用して、RESTful API(読み取り専用 - GETのみ)を介してデータを提供できるソリューションがあれば理想的です。

+0

あなたは 'enum'を使うことができます。 – RSB

+0

@RSB - 私は誤解されるかもしれませんが、' enum'は実際には数字の文字列識別子として機能しませんか?意味は、列挙型は複雑なオブジェクトではなく、1つの値に過ぎませんか?これはいくつかの状況に適しているかもしれませんが、私はそれがここに適しているかどうかはわかりません。 例:私たちが国 - >電話プレフィックスを再び例に取るならば、私たちは国の部分と電話プレフィックス部分の両方を必要とします。また、 'User'と' Company'があれば、どちらも同じ国 - >電話のマッピングにアクセスする必要があるかもしれないので、両方のModelクラス(または親クラス)でenumを複製する必要がありますか? ありがとう – asibs

+0

私はあなたがオプション3を使用しなければならないと思います。1、本当に可能ではない、それは単にSQLの仕組みではありません。あなたはデータベースを照会しなければなりません、彼らは技術の別個の部分です。 2はあなたが探しているライブラリに依存します。例えばカルメンは国や州ではうまく機能し、そのデータを 'yml'ファイルhttps://github.com/jim/carmenに保存しますが、それがあなたが探しているデータでなければ、あなたは解決しなければなりません手動で更新されたアプローチ(ymlファイル)を使用します。 – Sean

答えて

1

"簡単"/"手動"のアプローチをあまりにも早く割り引いていると思います。

ルビーハッシュ/アレイにデータを書き込むことは、それほど悪いことではありません。

CRUDスキャフォールドを使用する場合は、標準のRailsモデル/コントローラジェネレータを使用するだけではいかがですか?静的なデータをデータベースに保存するのは本当に悪いですか?

3つ目のオプションは、データをファイルにシリアライズされた形式で保存し、アプリが読み込んでこれを読み込んでActiveRecordオブジェクトを作成することです。私は例を示してみましょう:

データ。YML

--- 
- a: "1" 
    b: "1" 
- a: "2" 
    b: "2" 

これは、ハッシュの配列を含むYAMLファイルです。あなたがそのようなファイルを作成することができます。データをロードするためにその後

require 'yaml' 
File.open("path.yml", "w") do |f| 
    data = [ 
    { "a" => "1", "b" => 1 }, 
    { "a" => "2", "b" => 2 } 
    ] 
    f.write(YAML.dump(data)) 
end 

、あなたはconfig/initializers/でファイルを作成します(ここではすべてがレールによって自動的にロードされます):

設定/初期化子/ static_data.rb MyObjectClassのデータベースの移行を記述することを避けるために

require 'yaml' 

# define a constant that can be used by the rest of the app 
StaticData = YAML.load(File.read("data.yml")).map do |object| 
    MyObjectClass.new(object) 
end 

(それが実際にDBに格納されていないとき)あなたのためのattr_accessor定義を使用することができます属性:

class MyObjectClass < ActiveRecord::Base 
    # say these are your two columns 
    attr_accessor :a, :b 
end 

ちょうど(あなたがこれらのメソッドをモンキーパッチがない限り)このモデルにsavedelete、またはupdateのようなものを実行しないようにしてください。

REST/CRUDエンドポイントを使用する場合は、データを変更する方法が異なるため、ゼロから書き込む必要があります。 あなたは基本的に3段階のプロセスで任意の更新を行う必要があると思います:Rubyのオブジェクトリスト

  • 変更Rubyのオブジェクトリスト
  • にYAMLからデータをYAMLにすべてをシリアライズして保存

    1. 負荷を。

    ここで、増分更新は実際には行われていません。あなたはYAMLの代わりにJSONを使うことができ、同じ問題があります。 Rubyの内蔵ストレージシステムPStoreを使用すると、個別にオブジェクトを更新できるようになりますが、SQLをプロダクションWebアプリケーションに使用する方がはるかに優れたアイデアです。

    これらの「シリアライズされたデータ」オプションを超えて移動するキーバリューストレージサーバーには、データがメモリに格納されます。 MemcachedやRedisのようなもの。

    しかし、以前の私のところに戻るには、SQLを使用しないことを正当な理由がない限り、あなたは物事をより難しくしています。

  • +0

    私は同様の状況に陥っています。私はデータベースが小さすぎてクエリがかなり大きいので、dbに格納するつもりはありません。これらのデータの更新も非常にまれです。だから、何かコーチングのメモリや何か追加のクエリを避けるために素晴らしいだろう。私は更新が難しいと思うので、Yamlやjsonのアプローチが嫌いです。 – Anwar

    +0

    これをメモリに保存してください。あなたの質問が本当にわかりません。 –

    関連する問題