2012-06-26 27 views
5

Ví dụ tôi có điều này trong điều khiển trỏ của tôiCó cách nào để lưu bộ nhớ cache cuộc gọi .all không?

@users = User.current 

này là của tôi mô hình tài

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

Đó là về cơ bản lấy tất cả các hồ sơ và tôi không paginating vì tôi đang sử dụng bảng datatables jquery có tìm kiếm bộ lọc tuyệt vời ... vấn đề tôi muốn đạt được là lưu bộ nhớ cache này nếu có thể trừ khi có người dùng mới ... không xảy ra thường xuyên

Tôi đã đọc về fresh_when nhưng không biết điều gì có thể sử dụng ở đây

CẬP NHẬT

Sau khi làm theo các câu trả lời dưới đây tôi không thấy CACHE trong nhật ký tất cả tôi thấy được

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

Bạn có bao nhiêu người dùng trong DB của mình? –

+0

600 người dùng nằm trong db – Trace

+0

bạn đã bao giờ tìm được giải pháp cho điều này chưa? Tôi gặp vấn đề tương tự? :( –

Trả lời

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 

Đảm bảo bộ nhớ đệm được kích hoạt trong config/môi trường/* .rb:

config.action_controller.perform_caching = true 

Đây là những gì bạn muốn kiến. Đọc thêm ở đây:
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

Khi lưu trữ các mô hình trong bộ nhớ cache, bạn có thể chạy vào một vấn đề kỳ lạ xảy ra khi bộ nhớ cache được nạp trước khi mô hình được nạp. Không phải lo lắng, điều này sẽ chỉ xảy ra trong sự phát triển, và có cách khắc phục (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 

CẬP NHẬT
Thông báo các .all trong User.where().order().all. Nếu không có điều đó, giá trị được lưu trữ trong bộ nhớ cache chỉ là một quan hệ ActiveRecord và không phải là kết quả thực tế. Nếu không có .all một truy vấn sẽ vẫn phải chạy. Cảm ơn @Frederick Cheung vì đã chú ý đến chúng tôi.

+0

Giải pháp của bạn có vẻ tuyệt vời nhưng khi tôi nhìn vào nhật ký tôi không thấy bộ nhớ cache tôi thấy đồng bằng sql mọi lúc ... tôi sẽ cập nhật câu hỏi của mình – Trace

+0

oh yeah ... caching bị tắt theo mặc định trong phát triển ... xem chỉnh sửa – tybro0103

+0

Một lần đặt trước - Rails đang sử dụng 'FileStore' theo mặc định với marshal/unmarshal có thể chậm hơn SQL trực tiếp (phụ thuộc vào đĩa cục bộ), cũng được bật theo mặc định trong R3.2 –

Các vấn đề liên quan