如何在mongodb的rails中编写LIKE语句

时间:2018-12-27 18:22:08

标签: ruby-on-rails mongodb

当我使用整个单词,但我也希望部分单词能够被识别时,搜索就可以了。

我在这里有表格:

= form_tag({}, method: :get) do
      = text_field_tag :query, query, class: 'form-input search__input', placeholder: t('.placeholder')
      - if query.nil?
        %span.search__icon.fa.fa-search{ aria: { hidden: 'true' } }
      - else
        = link_to more_path do
          %span.search__icon.text-success.fa.fa-times{ aria: { hidden: 'true' } }

控制器:

  def set_query
    @query = params[:query]
  end


  def set_documents
    @documents = @folder ? @folder.documents : current_user.documents
    @documents = (params[:query] ? @documents.where(
      :$text => {:$search => params[:query]}
    ) : @documents).page(params[:page])
  end

我尝试将其添加到控制器中以使其按我的意愿工作:

@documents = Document.where('name LIKE ?', "%#{@query}%")
      end

但是我得到了错误:

wrong number of arguments (given 2, expected 1)

我应该如何写,这样搜索不仅可以对整个单词进行搜索,而且还可以对部分单词进行搜索。

2 个答案:

答案 0 :(得分:0)

如果您使用的是蒙古包,则可以在where中使用正则表达式:

Document.where(name: /.*(#{@query})+.*/i)

或尝试any_of

Document.any_of(name: /.*(#{Regexp.escape(@query)}).*/i)

因此,您的set_documents方法应类似于:

def set_documents
  @documents = @folder ? @folder.documents : current_user.documents
  @documents = (params[:query] ? @documents.where(
    name: /.*#{@query}.*/i
  ) : @documents).page(params[:page])
end

答案 1 :(得分:0)

Mongoid支持查询中的正则表达式

User.where(:name => /.*anand.*/i )

此处 i 用于不区分大小写的匹配。

search_term = params[:search_term]
User.where({:name => Regexp.new ("/.*"+search_term+".*/") })

您可以在reg对象中编写任何正则表达式