【问题标题】:Perform a search on an individual column in Rails在 Rails 中对单个列执行搜索
【发布时间】:2014-07-21 15:20:43
【问题描述】:

这可能是一个非常基本的新手问题。我需要创建一种在单个列上的模型中搜索的方法。该模型称为视频。我想在标题栏上搜索。我在想这个方法应该是这样的:

class Video < ActiveRecord::Base

  def self.sear_for_video_by_title(search_phrase)
    #do the search here
  end
end

我只是不确定执行此类操作的正确语法是什么。我想我需要使用 like 关键字。也许是这样的:

video = Video.were(:title).like(search_phrase)

我敢肯定,这很离谱,但这是我要遵循的基本逻辑。

【问题讨论】:

    标签: ruby-on-rails ruby search


    【解决方案1】:

    假设 Ruby on Rails 3 和 ActiveRecord 3.2.x,你可以这样做:

    video = Video.where("title like ?", "%#{params[:search_phrase]}%")
    

    会返回你想要的结果。但是这里有几件事情你需要考虑。

    1. 通配符字符串搜索在数据库方面非常昂贵。您需要考虑存储关键字等元数据,并通过这些关键字进行搜索。
    2. 您需要阅读 SQL 注入,并了解它为何如此重要,以及如何通过上述方法等技术避免它。

    更多信息请参见http://guides.rubyonrails.org/security.html

    【讨论】:

      【解决方案2】:

      您可以执行以下操作:

      Video.where('title LIKE ?', "%#{search_phrase}%")
      

      并确定它的范围:

      class Video < ActiveRecord::Base
        scope :with_title_like, ->(phrase) { where('title LIKE ?', "%#{phrase}%") }
      

      用法:

      @videos = Video.with_title_like('Jurassic')
      

      您可以改进这种研究方法:

      • phrase的每个空格上拆分并搜索每个词,
      • make 不区分大小写,
      • 拓展其他领域的研究(如description领域)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-08-17
        • 2012-03-11
        • 1970-01-01
        • 2016-01-24
        • 2011-07-22
        • 1970-01-01
        • 2013-08-14
        • 1970-01-01
        相关资源
        最近更新 更多