문제

테이블의 모든 모델을 캐시하고 만료해야합니다.

예를 들어, 통화라는 모델이있는 경우 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

이를 처리 할 수있는 플러그인이있을 수 있지만 전혀 조사하지 않았습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top