当我使用整个单词,但我也希望部分单词能够被识别时,搜索就可以了。
我在这里有表格:
= 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)
我应该如何写,这样搜索不仅可以对整个单词进行搜索,而且还可以对部分单词进行搜索。
答案 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对象中编写任何正则表达式