2014-09-29 2 views
0

검색에 와일드 카드를 사용할 수있는 기능을 추가하고 싶습니다. 레일 3 SQLite3 함께 사용하고 있습니다. 내 검색은 모델에 정의 된 범위를 사용하여 컨트롤러의 인덱스 동작에 내장되어 있습니다.와일드 카드로 레일 범위 검색

scope :by_drawing_number, lambda { |drawing_number| where('drawing_number LIKE ?', "#{drawing_number}") unless drawing_number.nil? } 

사용자가 '?'을 입력하면 수정하고 싶습니다. 단일 문자 와일드 카드의 경우 '_'로 대체되고 여러 문자 와일드 카드의 경우 '*'는 '%'로 대체됩니다.

이러한 대체를 내 범위에 통합 할 수있는 방법이 있습니까? 범위를 방법으로 다시 작성해야합니까? 그렇다면 메소드는 어떻게 생겼을 까?

답변

1

원하는 논리를 범위 안에 넣을 수 있습니다. scope은 기본적으로 클래스 메소드를 정의하기위한 문법적 설탕입니다. 이 같은 것이 작동해야합니다 :

scope :by_drawing_number, lambda {|drawing_number| 
    break if drawing_number.nil? 
    match = drawing_number.tr('?*', '_%') 
    where('drawing_number LIKE ?', match) 
} 
+1

완벽합니다. 감사. 유일한 것은? _가 전환되어야합니다. – sabrams

+0

아, 잘 잡으세요. 결정된! –