5

たとえば、インデックスコントローラーにこれがあります

@users = User.current

これは私のユーザーモデルです

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

これは基本的にすべてのレコードを取得しており、優れたフィルター検索を持つjquery datatablesテーブルを使用しているため、ページネーションはしていません...私が達成したい問題は、新しいユーザーがいない限り、可能であればこれらをキャッシュすることです...これはあまり頻繁には起こりません

fresh_when について読みましたが、ここで何が使用できるかわかりませんでした

アップデート

以下の回答に従った後、ログに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
4

1 に答える 1

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

config / environment/*。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
のに 注意し.allUser.where().order().allください。それがないと、キャッシュに保存される値は単なるActiveRecordリレーションであり、実際の結果ではありません。.allがなくても、クエリを実行する必要があります。それを私たちの注意を引いてくれた@FrederickCheungに感謝します。

于 2012-06-26T14:31:45.440 に答える