【问题标题】:Exact Term Search In RailsRails 中的精确词搜索
【发布时间】:2017-10-21 04:55:24
【问题描述】:

我正在尝试构建一个基本搜索,其中只有整个确切的搜索词会显示结果。目前它正在显示基于单个单词的结果。

这是模型中的代码:

def search
  find(:all, :conditions => ['term' == "%#{search}%"])
end

提前抱歉。我对rails很陌生!

谢谢。

【问题讨论】:

  • 试试find(:all, :conditions => ['term' == "#{search}"])
  • 你使用什么版本的 Rails?
  • 我使用的是 Rails 5.0.0
  • 你的控制器是什么样子的?应该匹配的列的名称是什么?
  • before_action :set_index def set_index @b = Best.all if params[:search] @bests = @b.search(params[:search]).order(:cached_weighted_score => :desc) else @bests = @b.none end end

标签: ruby-on-rails ruby search


【解决方案1】:

"%#{search}%" 中删除 %,所以它是"#{search}"

% 是一个通配符,它​​匹配包含该单词的每个结果。所以"%tea%" 会匹配泪珠、巢穴和蒸汽,而这不是你想要的。

这应该会产生完全匹配:

def search find(:all, :conditions => ['term' == "#{search}"]) end

【讨论】:

  • 感谢您,但我仍然遇到问题。例如,如果我搜索单个字母“a”或示例,我会得到每个名称中包含字母“a”的列表。
  • 看起来我的 def 搜索由于某种原因没有任何影响。我已经全部删除了,我仍然得到相同的结果。这是视图中的代码:<%= form_tag root_path, :method => 'get', :class => "input-group-lg" do%> <%= text_field_tag :search, params[:search], remote: true, :class => "form-control", :placeholder => " Search for the best...", :autofocus => true % <%= submit_tag "Search", :name => nil, remote: true, :class => "btn search-btn btn-lg" %>
【解决方案2】:

由于多种原因,您的代码无法正常工作。

  1. 您没有向该方法传递任何值。因此search 将永远是nil
  2. ['term' == "%#{search}%"] 条件没有多大意义,因为 - 正如我之前所说 - search 未定义,因此条件将与 ['term' == "%%"] 相同。字符串term 不等于%% 因此整个条件基本上是:[false]
  3. Rails 5.0 对查询使用不同的语法。您使用的语法非常陈旧,不再适用。

我会这样做:

# in your model
scope :search, -> (q) { 
  q.present? ? where("column_name LIKE :query", query: "%#{q}%") :none 
}

# in your controller
def set_index 
  @b = Best.search(params[:search]).order(:cached_weighted_score => :desc)
end

【讨论】:

    猜你喜欢
    • 2011-02-07
    • 1970-01-01
    • 2013-10-07
    • 1970-01-01
    • 1970-01-01
    • 2018-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多