首页 > 解决方案 > 如何在 mongodb 的 Rails 中编写 LIKE 语句

问题描述

当我使用整个单词时搜索正在工作,但我也希望识别部分单词。

我这里有表格:

= 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)

我应该如何写这个,以便搜索不仅可以用于整个单词,还可以用于部分单词。

标签: ruby-on-railsmongodb

解决方案


如果你使用 mongoid,你可以在你的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

推荐阅读