2012-06-26 21 views
5

私は、これは私のUserモデル基本的にすべてのレコードをつかんされ.all呼び出しをキャッシュする方法はありますか?例えば

scope :current, :conditions => { :active => true }, :order => 'LOWER(first_name), LOWER(last_name) ASC' 

ある

@users = User.current 

私のインデックスコントローラでこれを持っていると私はjqueryのDataTableのテーブルを使用していますので、私はページ付けていないですそれは素晴らしいフィルター検索を持っています...私が達成したい問題は、新しいユーザーがいない限り、可能であればこれらをキャッシュすることです...多くの場合起こりません。

私はfresh_whenについて読んでいますが、ここ

UPDATE

使用私はログにCACHEを参照してくださいいけないの下に答えを以下の後、私が見るすべては、そのキャッシュが設定/環境/ *で有効になっていることを確認し

Company Load (0.4ms) SELECT `companies`.* FROM `companies` INNER JOIN `positions` ON `companies`.`id` = `positions`.`company_id` WHERE `positions`.`user_id` = 551 
    Company Load (0.4ms) SELECT `companies`.* FROM `companies` INNER JOIN `positions` ON `companies`.`id` = `positions`.`company_id` WHERE `positions`.`user_id` = 93 
    Company Load (0.4ms) SELECT `companies`.* FROM `companies` INNER JOIN `positions` ON `companies`.`id` = `positions`.`company_id` WHERE `positions`.`user_id` = 668 
+0

DBにはどのくらいのユーザーがいますか? –

+0

600人のユーザーがdb – Trace

+0

にいますこれまでの解決方法を見つけましたか?私は同じ問題を抱えていますか? :( –

答えて

6
class User < ActiveRecord::Base 
    after_save :clear_cache 

    def self.current 
    Rails.cache.fetch("current_users", expires_in: 1.hour) do 
     User.where(active: true).order("LOWER(first_name), LOWER(last_name) ASC").all 
    end 
    end 

private 

    def clear_cache 
    Rails.cache.delete("current_users") 
    end 

end 

です.rb:

config.action_controller.perform_caching = true 

これはあなたのものです蟻。もっとここで読む:
http://robotmay.com/post/23161612605/everyone-should-be-using-low-level-caching?bda26d48
http://www.tmatthew.net/blog/rails-caching-example
http://api.rubyonrails.org/classes/ActiveSupport/Cache/Store.html#method-i-fetch

キャッシュにモデルを保存するには、モデルがロードされる前にキャッシュがフェッチされたときに発生する奇妙な問題に遭遇することがあります。心配しないで、これが唯一の開発に起こるのだろう、と修正(application_controller.rb)があります:

before_filter :load_models_if_dev 
def load_models_if_dev 
    if Rails.env == 'development' 
     User; Post; Comment # whatever other classes that can get cached. 
    end 
end 

UPDATE
お知らせUser.where().order().all.all。それがなければ、キャッシュに格納された値はActiveRecordの関係であり、実際の結果ではありません。 .allがなければ、依然としてクエリを実行する必要があります。私たちの注目を集めてくれてありがとう@Frederick Cheung

+0

あなたの解決策は素晴らしいようですが、ログを見るとキャッシュが見えません毎回プレーンなSQLを参照してください...私の質問を更新します – Trace

+0

ああ...キャッシングはデフォルトでは無効になっています...編集を参照してください – tybro0103

+0

1つの予約 - Railsはmarshal/unmarshalでデフォルトで 'FileStore'を使用しています。これは直接SQLよりも遅く(ローカルディスクに依存します)、R3.2でデフォルトで有効になっています。 –

関連する問題