테이블의 모든 모델을 캐시합니다
-
11-07-2019 - |
문제
테이블의 모든 모델을 캐시하고 만료해야합니다.
예를 들어, 통화라는 모델이있는 경우 10 개 미만의 통화 만 있습니다. 따라서 다음과 같은 것이 좋을 것입니다.
class Currency < ActiveRecord::Base
cache_all(:expire_in => 10.minutes)
end
~하도록 하다
Currency.all
Currency.find_by_name("USD")
DB에 도달해서는 안됩니다.
좋은 접근법이 무엇이라고 생각하십니까?
또한 DB에 의해 백업되지 않은 모델을 사용하는 것이 더 나을 것이라고 생각한다면, 이에 대해 의견을 제시하십시오. AR 스타일 협회를 원한다는 점에 주목하십시오.
해결책
데이터 세트가 너무 작기 때문에 아마도 가장 좋은 점은 로컬 메모리로 캐시하는 것입니다. 이 작업을 수행하는 몇 가지 방법이 있습니다. 하나는 사용하는 것입니다. 내가 여기서 보여주는 것처럼 메모 화. 그러나 그것은 가장 효율적이지 않기 때문에 all
방법 및 find_by_name
별도의 캐시로의 방법은 동일한 객체이더라도.
대안은 객체를 수동으로 캐시하는 메소드를 재정의하는 것입니다. 이 같은.
class Currency < ActiveRecord::Base
def self.all
@all_cache ||= super.map(&:freeze) # freeze so you don't modify the cached objects
end
def self.find_by_name(name)
all.detect { |c| c.name.to_s.downcase == name.to_s.downcase }
end
def self.flush_all_cache
@all_cache = nil
end
end
이를 처리 할 수있는 플러그인이있을 수 있지만 전혀 조사하지 않았습니다.
제휴하지 않습니다 StackOverflow