2017-05-18 18 views
0
내가 레일 (5)을 사용하고

나는이 모델Rails가 항상 데이터베이스를 사용하지 않고 캐시를 사용하도록하려면 어떻게해야합니까?

class MyObject < ActiveRecord::Base 
    ... 
    belongs_to :distance_unit 

을 가지고 있고 나는 그것이이

SELECT "distance_units".* FROM "distance_units" WHERE "distance_units"."id" = $1 LIMIT $2 [["id", 1], ["LIMIT", 1]] 

을 실행하기 위해 다음과 같은 원인

distance = Distance.new({:distance => my_obj.distance, :distance_unit => my_obj.distance_unit}) 

아래 같은 라인이 때주의 사항

특별한 것은 없지만 내 DistanceUnit 모델에서 캐시 된 메소드가 생성되었습니다.

class DistanceUnit < ActiveRecord::Base 

    def self.cached_find_by_id(id) 
    Rails.cache.fetch("distanceunit-#{id}") do 
     puts "looking for id: #{id}" 
     find_by_id(id) 
    end 
    end 

및 "데이터베이스에서 실행하는 대신 캐시 된 기능을 호출하려면"distance = Distance.new ({: distance => my_obj.distance, : distance_unit => my_obj.distance_unit}) "행을 사용하고 싶습니다. 이것을 어떻게 할 수 있습니까?

+0

캐시를 저장하기 위해 무엇을 사용하고 있습니까? – murb

+0

오, 좋은 질문입니다. 내 config 파일에 "config.cache_store = : memory_store"가 있습니다. – Dave

답변

0

내 메모에 관해서는 memory_store는 프로세스 내에서만 사용되므로 각 프로세스마다 고유 한 저장소가 있습니다 (문제인 경우 MemCacheStore을 고려하십시오). 또한 프로세스가 끝나면 캐시가 사라집니다.

일반적으로 belongs_to 연결은 개체가 아직 가져 오지 않았 으면 의 조회를 본질적으로 트리거합니다.. Rails 프레임 워크에는 많은 캐시가 내장되어 있습니다. 일반적으로 처음에는 조기 최적화에 대해 너무 걱정하지 않아도됩니다. 쿼리가 너무 느리게 실행되는 경우에만 최적화하십시오.

또한 캐시 액세스는 일종의 데이터베이스에 대한 호출이기도하며 일반적으로 색인 된 ID를 기반으로하는 조회는 일반적으로 많은 호출이 아닙니다. 또한 거리 단위가 몇 개 있다면 상수를 사용할 수도 있습니다.

하지만 질문에 대답하십시오. 귀하의 코드에 cached_find_by_id이라고 쓰여있는 내용이없는 것 같습니다. (그리고 레일은 많은 것들을 자동으로 수행하지만, 이것들은 하나도 아닙니다.) 당신은 단순히 액티브 오브젝트를 초기화하고 당신이하지 경우, 그러나

def distance_unit 
    DistanceUnit.cached_find_by_id(distance_unit_id) 
end 

:

당신은 belongs_to 협회에 의해 생성 된 '게터'을 무시 MyObject에서 다음과 같은 방법을 만들 수 이 호출에서 DistanceUnit이 필요합니다. 데이터베이스에 저장된 내용이므로 ID를 직접 전달할 수도 있습니다.

Distance.new({:distance => my_obj.distance, :distance_unit_id => my_obj.distance_unit_id})