2011-04-26 2 views
0

GET 매개 변수를 기반으로하고 named_scope을 사용하여 ActiveRecord에서 쿼리를 구성하고 싶습니다. 나는 체인 일부 범위를 거라고 및 GET의 PARAM의 가용성에 따라 조건을 추가 생각했지만, 나는이 뜻은 각 쿼리 부분에 새 쿼리를 보내는 DB를 과로 추가 두려워 :Rails 2.3.x - 게으른 db 쿼리

# in model 
named_scope :sorted, :order => 'title, author' 
named_scope :archived, :conditions => { :is_archived => true } 
named_scope :by_date, lambda { |date| { :conditions => [ 'updated_at = ?', date ] } } 

# in controller/helper 
@articles = Article.sorted.all 
@articles = @articles.by_date(params[:date]) if params[:date] 
@articles = @articles.archived if params[:archived] == '1' 

내가 생각 한 또 다른 옵션을 메서드 체이닝 문자열을 구축하고 있습니다. 그 문자열은 Object#send을 사용하여 객체로 보내지 만, named_scope가 (by_date과 같은) 인자를 받으면 약간 더럽고 다소 문제가있는 것처럼 보입니다. 나는 ActiveRecord::Base#find에서 :conditions => ...과 함께 사용할 질의 문자열을 만들 수 있다는 것을 알았지 만, named_scope로 먼저 시도해보고 후자와 함께 게으른 질의를 할 수 있는지 알아볼 것이라고 생각했습니다. named_scope를 사용하고 데이터베이스가 쿼리에 의해 포격되지 않도록하는 방법에 대한 제안 사항은 무엇입니까? 감사.

답변

1

당신은 람다 더 똑똑 할 수

# in model 
named_scope :sorted, :order => 'title, author' 
named_scope :archived, lambda { |is_archived| (is_archived == 1) ? {:conditions => {:is_archived => true}} : {}} 
named_scope :by_date, lambda { |date| date.nil? ? {} : { :conditions => [ 'updated_at = ?', date ]}} 

# in controller/helper 
@articles = Article.by_date(params[:date]).archived(params[:archived]).sorted 
관련 문제