2010-02-03 1 views
3

나는 사용자 정의 파인더 아래 정의 :명명 된 범위를 호출하는 사용자 지정 ActiveRecord 찾기?

named_scope :eager, :include => [{:container_inventory => {:container => [:size_type, :grade]}}, :company, :truck, :hauler] 

협회는 설치가 경유 :

class ContainerGateIn << ActiveRecord::Base 
    ... 
    def self.search(text) 
    result = if text 
     text.split(' ').inject(self) do |result, criteria| 
     case criteria 
      when /^[0-9]{4}-[0-9]{2}-[0-9]{2}$/ 
      result.search_by_date(criteria.to_date) 
      else 
      result.search_by_text(criteria) 
     end 
     end 
    else 
     self 
    end 
    end 
    ... 
end 
search_by_date 및 search_by_text이 범위를 명명 된

, 열망은 범위라는 열망 로딩과 같이 정의입니다 HMT (has_many : 통해)

파인더가 ContainerDepot에서 중첩 관계를 통해 호출 될 경우 문제가
class ContainerDepot << ActiveRecord::Base 
    has_many :container_inventories 
    has_many :container_gate_ins, :through => :container_inventories do 
end 

때문에 실패 ActiveRecord :: Statement :: Invalid를 사용하여 테이블이 두 번 이상 지정되었음을 나타냅니다.

ContainerDepot.first.container_gate_ins.eager.search(text) 
=> ActiveRecord::StatementInvalid: PGError: ERROR: table name "container_inventories" specified more than once 

내가 연관 확장으로 전체 사용자 정의 찾기 복사하여이를 정정 할 수 :

class ContainerDepot << ActiveRecord::Base 
    ... 
    has_many :container_gate_ins, :through => :container_inventories do 
    def search(text) 
     ... custom finder code from ContainerGateIn ... 
    end 
    end 
    ... 
end 

그것은 비록 매우 건조하지 않습니다 및 사용자 정의 파인더로, 매우 불필요하고 잠재적으로 문제 중복을 소개 것 추가 검색 논리를 수용하기 위해 수시로 변경해야합니다.

더 나은 방법에 대한 아이디어가 있으십니까?

답변

0

당신은 당신이 범위 지정 방법에 매개 변수를 전달할 수 있도록 람다와 named_scope 사용할 수 있습니다

named_scope :eager, lambda {|text| {:conditions=>{:name=>text}, :include => [{:container_inventory => {:container => [:size_type, :grade]}}, :company, :truck, :hauler]}} 

이 당신이 포함 단 하나의 이름 범위로 필터링 할 수 있습니다.