2016-07-29 8 views
0

モデルを参照するたびにデータベースにヒットしないようにグローバル変数を保存します。モデルのコレクションを保持するグローバル変数を格納

イニシャライザでこれを行う必要がありますか、別の方法がありますか?それは時にアプリのリロードのみリフレッシュすることに結構ですので、私は、コードベースを変更しない限り、

$rules = Rule.all 

このデータは変更されることはありません。

どのようなオプションがありますか?

私は私のコントローラでも、これを行うことができると思います。

$rules ||= Rule.all 

これに関する「ベストプラクティス」はありますか?

+0

これは悪い考えです。まずはなぜキャッシュを必要としているのかを知る必要がありますか?起動時に値をキャッシュしますか? –

+0

データが静的な場合は、単純なRubyハッシュまたは配列の代わりにデータベースを使用するのはなぜですか? – meagar

+0

@ArupRakshitはい、ブートアップします。 – Blankman

答えて

1

[OK]をクリックし、config/initializers/ディレクトリ内にload_rules.rbのようなファイルを作成します。そして、その中に次のような文章を書いてください。

ActiveSupport.on_load(:active_record) do 
    RULES = Rule.all 
end 

ここで、この定数をどこでも使いたいと思ってください。

+0

なぜ彼はデータベースで何もしていないときにActiveRecordオブジェクトを使用する必要がありますか? – siegy22

+0

@RaVeN彼は_model_という用語を使用しました。私がモデルを参照するたびにデータベースにヒットしないように、グローバル変数を保存したいライン_は、私がこの解決策に結論づけるのに十分です。しかし、私があなたの答えのコメントで言ったように、静的なデータはモデルを必要としません。私は後にデザインの匂いに気付く。 –

+0

「モデル」は常にActiveRecordモデルであると言いますか? – siegy22

0

あなたはそのようなことのためにデータベースを使いたくないと思います。あなたは、オブジェクトの配列としてこれらの値を格納し、Rails.app.config.x名前空間を使用する必要があります。

ので、あなたのモデルは次のようになります。

#app/models/rule.rb 
class Rule 
    attr_reader :name 

    def initialize(name:) 
    @name = name 
    end 
end 

とあなたの初期化子:

# config/initializers/rules_initializer.rb 
Rails.application.config.x.rules = [ 
             Rule.new(name: "Admin"), 
             ... 
            ] 
+0

この方法では、ルールセットが変更されたときにコードを変更する必要があります。 –

+0

オブジェクトを作成するには、 'seeds.rb'ファイルが良いと思います。 –

+0

@ NicNilovセットが変更された場合、どのようにコードを変更しませんか?それをデータベースに保存しますか? – siegy22

1

私が使用してお勧めしたいです方法でラップされた低レベルキャッシング:

class ApplicationCotroller < ActionController::Base 
    # ... 

    def all_rules 
     Rails.cache.fetch("all_rules") do 
     Rule.all 
     end 
    end 

    # ... 
end 

あなたのユースケースでは、メソッドはApplicationControllerの代わりに、またはmixin Moduleの代わりにシングルトンクラスに置くことができます。

このアプローチの主な利点は、コンソールからキャッシュキーを削除することで、サーバーを再起動せずにルールを簡単に再ロードできることです。これは明らかにこれを重要ではない面としてマークしましたが、私はそれがいくつかの利便性を追加すると思います。

+0

私はあなたのキャッシュアプ​​ローチが好きでした! +1。その理由は、再起動せずにデータを更新できるからです。良いアイデア! –

+0

しかし、私はそれを他の文脈で使ってみたいと思っています。おそらく、グローバルアクセスのために、いくつかの初期化子の種類を内部に入れる必要があります。 –

+1

はい、言及したように、ユースケースに応じて別の場所に配置することができますが、イニシャライザは1つのオプションです。 –

関連する問題