2013-08-24 74 views
1

我正在使用ransack在我的rails 3.2應用程序中使用postgres作爲數據庫進行搜索。如果在搜索詞中有「空格」,則搜索搜索不起作用

我有一個發票模型,並且每個發票屬於買主。以下是我在索引頁面中的搜索表單。

的意見/發票/ index.html.erb

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

這是我的控制器代碼。

控制器/ invoices_controller.rb

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 

比方說,一個發票是有其買家的名字 「蝙蝠人」。

如果我搜索「蝙蝠」,我得到結果的發票。 再次,如果我搜索「人」,我會得到結果的發票。 但是,如果我搜索「蝙蝠俠」,我沒有得到結果的發票。

我知道這可能是微不足道的,但我無法解決。

更新

當我試圖使用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不支持多項術語的搜索,我解決了我的定製方式的要求。詳情如下:在你看來

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

添加範圍模型。而是採用由洗劫提供f.text_field :buyer_name_cont,使用普通場幫手text_field_tag :buyer_name, params[:buyer_name]

然後限制範圍的洗劫:

scope = Invoice.like_search(:name , params[:buyer_name]) 
@q = scope.ransack(params[:q])