2011-12-20 3 views
1

愚かな質問のように見えますが、定期的にルビオブジェクトにデータをフェッチする方法を教えてください。または試行回数の後、ルビオブジェクトにデータを定期的に取得していますか?

は、私が持っているとしましょう:

@variable = SomeModel.all 

と私はので、私は

@variable ||= SomeModel.all 

しかし、どのように私はなっていますを行うことができた結果のすべての時間を取得したくありませんmemcacheやサードパーティーのソリューションのようなものを使わずに定期的に毎回行うのですか?そんなことをやるにはどんなトリッキーな方法?

ありがとうございました。

+0

あなたは仕事をすることができるかどうかを確認するために調べましたか? –

+0

あなたは何を意味するか分かりません。リフレッシュが必要な場合を除いて、現在の値を返すシンプルな時間ベースのゲッターを実装することができます。クラスを変更することなく*自動的に発生するものが必要な場合は、ジョセフは正しい軌道に乗っています。 –

+0

これは速くありがたいことですが、ジョセフは放射状のラッパーを作り直していませんか?サードパーティーの宝石を使用する必要はありませんが、トリッキーなコードでネイティブのルビーを使って行うことはできませんか?デイブは私が時間ベースのgetterのthingyをグーグルにしているのを助けてくれてありがとう:) –

答えて

1

Cache ={} 
def fetch(key, ttl) 
    obj, timestamp = Cache[key] 
    now = Time.now 
    if obj.nil? || now - timestamp > ttl 
    obj = yield 
    Cache[key]=[obj, now] 
    end 
    obj 
end 

使用方法:また、有効な値である

variable = fetch(:variable, 10.seconds) { SomeModel.all } 

nil場合は、単にキャッシュから読み込む際にデフォルトとしてデフォルト:no_value_storedを使用している場合のブロックを変更します。

Sidenote:は、キーが多すぎるとハッシュが無期限に増加するため、あなたを爆破する可能性があるため、手動でクリーンアップするか弱い参照を使用する必要があります。

1

最初に@variableを数分間保存できることを確認してください(コントローラインスタンス変数にはできませんが、モジュールの変数になる可能性があります)。

次に、変数を最後に更新した日時を表すDateTimeオブジェクトを保持します。変数にアクセスするたびに、DateTimeが10分より古いかどうかを確認します。 ifが古い場合は、変数とDateTimeを更新します。テストされていない

+0

私はまったくレールを使用していないので、コントローラ内で使用していません。あなたの助けてくれてありがとう、私はこれ以上十分だと思う。乾杯 –

関連する問題