2011-09-27 3 views
1

레일의 모델에 캐싱을 추가 할 때, 다음과 같은 반복적 인 성격이 : 내가 찾을레일 : 캐시 검색을 위해 모델에 추가 메소드를 추가

class Team < ActiveRecord::Base 
    attr_accessible :name 
end 

Before caching, to retrieve a name, everything was trivial, 

team = Team.new(:name => "The Awesome Team") 
team.save 

team.name # "The Awesome Team" 
memcached를 사용하여 도입 캐싱으로

또는 레디 스가 나 자신의 모델에 메소드를 추가하면 반복적으로 반복됩니다 :

def get_name 
    if name_is_in_cache 
    return cached_name 
    else 
    name 
    end 
end 

def set_name(name) 
    # set name in cache 
    self.name = name 
end 

제가 이것을 없애는 확실한 방법이 있습니까? 나는 다른 방법으로 많은 필드를 캐싱하고 있는데,이 시점에서 attr_accessible이 사실상 중복되는 것으로 보입니다. 이것을 어떻게 정리할 수 있습니까?

+0

캐싱을 사용하도록 강요하는 복잡한/성능 집약적 인 방법의 몇 가지 예를 추가 할 수 있습니까? – James

답변

2

instance_eval 주위에 래퍼를 제공하는 믹스 인을 만듭니다. 테스트되지 않은 :

다음
module AttributeCaching 
    def cache(name) 
    instance_eval(<<-RUBY) 
     def get_#{name} 
     if #{name}_is_in_cache 
      return cached_#{name} 
     else 
      #{name} 
     end 
     end 
    RUBY 

    instance_eval(<<-RUBY) 
     def set_#{name}(name) 
     self.#{name} = name 
     end 
    RUBY 
    end 
end 

모델의 :

class Team < ActiveRecord::Base 
    extend AttributeCaching 

    cache :name 
    cache :something_else 
end 

당신은 아마 다르게 캐싱 방법의 각각의 이름을 지정하지 않음으로써, 그러나, 훨씬 쉽게 당신의 인생을 만들 수 있습니다. get_cached(name)set_cached(name, value)과 같은 작업을 수행 할 수 없으면 갑자기 문제가 훨씬 덜 반복됩니다.

+0

원래의 질문에 좀 더 구체적이어야했습니다. 이것은 질문에 답합니다. 그러나 Redis와 같은 도구를 사용하면 데이터 유형이 다르며 이러한 유형을 추가/제거하는 방법이 다릅니다. 이 경우 위의 추상화가 실패합니다. 그렇게 말하면 원래 질문을받은 방식으로 질문에 답했고 그 점에 대해 감사드립니다. – randombits

관련 문제