2013-08-24 68 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])