2012-06-26 2 views
5

나는이 내 사용자 모델 기본적으로 모든 레코드를 잡아입니다.all 호출을 캐시하는 방법이 있습니까? 예를 들어

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

입니다

@users = User.current 

내 인덱스 컨트롤러이 있고 나는 JQuery와 datatables 테이블을 사용하고 있기 때문에 나는 paginating하고 있지 않다 그게 좋은 필터 검색을 가지고 ... 내가 원하는 달성하고자하는 문제는 새로운 사용자가 없다면 가능하면 이것을 캐싱하는 것입니다 ... 어떤 일이 자주 일어나지 않습니다 ...

나는 fresh_when에 대해 읽었지만 무엇이 될 수 있는지 알지 못했습니다. 캐싱을 확인

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 

가 설정/환경에서 사용할 수 있습니다 내가 로그에 캐시를 참조 해달라고 아래에 답을 수행 한 후 여기

UPDATE

사용 내가 볼 모든됩니다/* .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)가있다 :
공지 사항 User.where().order().all에서 .all

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. 이 값이 없으면 캐시에 저장된 값은 ActiveRecord 관계 일 뿐이며 실제 결과는 아닙니다. .all이 없으면 여전히 쿼리를 실행해야합니다. 우리의 관심을 끌었던 @Frederick Cheung에게 감사드립니다.

+0

당신의 솔루션은 멋지지만 로그를 볼 때 나는 캐시를 볼 때마다 평범한 SQL을 볼 것입니다 ... 제 질문을 업데이트 할 것입니다 – Trace

+0

오, 그렇습니다 ... 캐싱은 개발 중에는 기본적으로 비활성화되어 있습니다 ... 편집을 참조하십시오 – tybro0103

+0

하나의 예약 - 레일스는 기본적으로 marshal/unmarshal 명령을 사용하여 직접 SQL (로컬 디스크에 따라 다름)보다 속도가 느릴 수 있으며, R3.2에서 기본적으로 활성화되어 있습니다. –