1

我在使用 postgres 作为数据库的 rails 3.2 应用程序中使用ransack进行搜索。

我有一个发票模型,每张发票都属于一个买家。以下是我在索引页面中的搜索表单。

意见/发票/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])
    @invoices=@search.result(: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

假设有一个名为“蝙蝠侠”的买家的发票。

如果我搜索“蝙蝠”,我会在结果中获得发票。如果我再次搜索“Man”,我会在结果中得到发票。但是如果我搜索“蝙蝠侠”,我不会在结果中得到发票。

我知道这可能是微不足道的,但我无法解决。

更新

当我尝试使用pgAdmin直接在数据库中形成的sql查询时,我意识到在数据库中买家名称中有多个空格,例如“Bat.space.space.space.Man”。

可以做些什么让“Bat.space.Man”搜索在结果中也找到“Bat.space.space.space.Man”吗?

4

2 回答 2

0

你可以清理你的数据。例如与regexp_replace(). 在数据库中运行一次:

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

并同样清理新的插入和更新。

\s..“空白”的类简写(包括制表符或奇怪的空格)。
第四个参数'g'用于“全局”,需要替换所有实例,而不仅仅是第一个。

于 2013-08-24T14:26:31.740 回答
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_contransack 提供的,而是使用普通的字段助手text_field_tag :buyer_name, params[:buyer_name]

然后限制你的洗劫范围:

scope = Invoice.like_search(:name , params[:buyer_name])
@q = scope.ransack(params[:q])
于 2017-01-10T04:56:40.297 回答