2013-08-24 1 views
1

데이터베이스로 postgres를 사용하는 내 레일 3.2 응용 프로그램에서 검색을 위해 ransack을 사용하고 있습니다.검색어에 '공백'이 있으면 Ransack 검색이 작동하지 않습니다.

저는 인보이스 모델을 가지고 있으며 모든 구매 서가 구매자에게 속해 있습니다. 아래는 색인 페이지에서 내 검색 양식입니다.

보기/송장 여기에/index.html.erb

<%= search_form_for @search do |f| %> 
    <%= f.text_field :buyer_name_cont %> 
    <%= f.submit "Search"%> 
<% end %> 

그리고 내 컨트롤러 코드입니다.

def index 
    @search = Invoice.search(params[:q]) 
    @[email protected](:distinct => true).paginate(:page => params[:page], :per_page => GlobalConstants::PER_PAGE) 

    respond_to do |format| 
     format.html # index.html.erb 
     format.json { render json: @invoices } 
    end 
    end 

이의이 송장 구매자 가진 이름 "박쥐 맨"의가 있다고 가정 해 봅시다

컨트롤러/invoices_controller.rb.

"박쥐"를 검색하면 결과로 인보이스를받습니다. "Man"을 검색하면 결과에 인보이스가 표시됩니다. 하지만 "Bat Man"을 검색하면 결과에 인보이스가 표시되지 않습니다.

나는 그것이 사소한 것일 수도 있지만 해결할 수는 없다는 것을 알고 있습니다.

는 업데이트 내가 pgAdmin를 사용하여 데이터베이스에 직접 형성 SQL 쿼리를 시도

, 나는 데이터베이스에 구매자 이름에 여러 공간, Bat.space.space.space.Man "같은 것이 있었다는 것을 깨달았다 ".

"Bat.space.Man"검색 결과에서도 "Bat.space.space.space.Man"을 찾을 수 있습니까?

답변

0

데이터를 살균 할 수 있습니다. 예 : regexp_replace().

UPDATE invoice 
SET buyer = regexp_replace(buyer, '\s\s+', ' ', 'g') 
WHERE buyer <> regexp_replace(buyer, '\s\s+', ' ', 'g'); 

과 마찬가지로 새로운 삽입을 & 업데이트를 살균 : 일단 데이터베이스에 실행합니다.

\s .. "공백"(탭 또는 별난 공간 포함)에 대한 클래스 약어입니다.
네 번째 매개 변수 'g'은 "전역 적"매개 변수이며, 첫 번째 매개 변수뿐만 아니라 모든 인스턴스를 바꿀 필요가 있습니다.

0

Ransack은 여러 검색어에 대한 cont 검색을 지원하지 않으며, 요구 사항을 맞춤형으로 해결했습니다. 다음과 같은 세부 정보 :

모델에 범위를 추가

scope :like_search, ->(column, value) { 
    keywords = value.to_s.split.map{ |k| "%#{k}%" } 
    where(Array.new(keywords.size, "#{column} ILIKE ?").join(' AND '), *keywords) 
} 

를보기에.

scope = Invoice.like_search(:name , params[:buyer_name]) 
@q = scope.ransack(params[:q]) 
: 대신 더듬다가 제공 f.text_field :buyer_name_cont를 사용하는 다음 범위에 더듬다을 제한하는 일반 필드 도우미에게 text_field_tag :buyer_name, params[:buyer_name]

를 사용