【问题标题】:Ransack search not working if there is 'space' in search term如果搜索词中有“空格”,则 Ransack 搜索不起作用
【发布时间】:2013-08-24 10:44:10
【问题描述】:

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

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

views/invoices/index.html.erb

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

这是我的控制器代码。

controllers/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”吗?

【问题讨论】:

    标签: ruby-on-rails postgresql ransack


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案2】:

      Ransack 不支持连续搜索多个术语,我解决了我的自定义方式的要求。具体如下:

      为您的模型添加范围:

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

      在你看来。而不是使用ransack提供的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])
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多