2008-10-07 3 views
2

Account 모델은 다음과 같은 두 협회가 : 내보기 중 하나에서액티브 협회 캐싱 날짜 값

has_many :expenses, 
      :order => 'expenses.dated_on DESC', 
      :dependent => :destroy 

has_many :recent_expenses, 
      :class_name => 'Expense', 
      :conditions => "expenses.dated_on <= '#{Date.today}'", 
      :order => 'dated_on DESC', 
      :limit => 5 

내가 지금처럼 최근의 비용을 렌더링하고 있습니다 :

<% @account.recent_expenses.each do |expense| %> 
... 
<% end %> 

에 내 (프로덕션 모드로 실행되는) 스테이징 서버 및 프로덕션 콘솔에서도 @account.recent_expenses이 올바른 목록을 리턴합니다. 그러나 실제 프로덕션 서버에서는 최신 경비가 반환되지 않습니다. 내가보기에 @account.expenses@account.recent_expenses를 교체 할 경우

가 표시 있습니다 가장 최근의 비용은, 그래서 내 생각은 조건 조항의 #{Date.today} 부분은 어떻게 든 실행 처음 캐시되고 있다는 점이다. 생산 Mongrel 클러스터를 다시 시작하면 모든 최신 비용이 올바르게 반환됩니다.

이 문제가 발생하는 이유는 누구나 생각할 수 있습니까?이 문제가 발생하지 않도록 :recent_expenses 쿼리를 어떻게 변경할 수 있습니까?

레일 2.1.0을 사용하고 있습니다.

답변

6

레일스가로드 될 때 쿼리를 작성한 다음 사용자가 정확히 @@.recent_expenses를 호출 할 때마다 해당 쿼리를 다시 사용합니다.

레일스 2.1을 사용하고 있다면 named_scope를 사용하여 원하는 것을 얻을 수 있습니다.

named_scope :recent, lambda { {:conditions => ["expenses.dated_on <= ?", Date.today], :order => 'dated_on DESC', :limit => 5 } } 

람다 레일을 보장하기 위해 사용되는 쿼리를 매번 재 구축 : 당신의 비용 모델

다음 넣어. 당신의 계정에서

제거 :

has_many :recent_expenses ... 

다음 전화 : 앤드류처럼

<% @account.expenses.recent.each do |expense| %> 
... 
<% end %> 
3

말했다 협회 매크로는 Date.today처럼 (응용 프로그램 시작시 매우 동적 비트를 읽기)가 그 시점에서 구문 분석됩니다. 레일즈 2.1 이상을 사용하고 있다면 그의 솔루션이 작동합니다. 이전 버전의 경우, has_finder gem를 사용하거나 단지 비용 모델에 대한 다음과 같은 방법을 만들 수 있습니다 :이 같은

def self.recent 
    find(:all, :conditions => ['dated_on <= ?', Date.today], :limit => 5, :order => 'dated_on DESC') 
end 

클래스 메소드가 협회에 노출을 제대로 범위된다 - 그들과 named_scopes의 차이가 있다는 것입니다 당신은 그들을 묶을 수 없습니다. 여기

1

은 레일 3과 같을 것이다 것입니다 :

scope :recent, lambda { where("expenses.dated_on <= ?", Date.today).order('dated_on DESC').limit(5) } 

경고 : 람다에 싸여 있지 연쇄 범위에주의. 체인의 일부는 런타임에 평가되지만 응용 프로그램 서버 시작시 평가 될 수 있다고 생각할 수 있습니다. 이러한 다른 범위를 사용할 범위를 람다가 감싸는 지 확인하십시오.여기 설명 : http://www.slashdotdash.net/2010/09/25/rails-3-scopes-with-chaining/