Ruby on rails rails活动记录查询帮助(like子句)

Ruby on rails rails活动记录查询帮助(like子句),ruby-on-rails,activerecord,ruby-on-rails-3,Ruby On Rails,Activerecord,Ruby On Rails 3,我希望我的代码做两件目前没有做的事情 @students = Student.where(["first_name = ? OR middle_name = ? OR last_name = ?", params[:query].split]) 工作。(上面说我应该传递4个参数,但我希望用户能够在每个字段中键入单词并通过这些单词查找,然后返回任何匹配项) 实际使用Like子句而不是僵硬的equal子句 请帮助。这似乎是一个更适合使用搜索而不是SQL的问题。你有没有考虑过类似于或(solr可能太

我希望我的代码做两件目前没有做的事情

@students = Student.where(["first_name = ? OR middle_name = ? OR last_name = ?", params[:query].split])
  • 工作。(上面说我应该传递4个参数,但我希望用户能够在每个字段中键入单词并通过这些单词查找,然后返回任何匹配项)

  • 实际使用Like子句而不是僵硬的equal子句


  • 请帮助。

    这似乎是一个更适合使用搜索而不是SQL的问题。你有没有考虑过类似于或(solr可能太过分了)

    …如果必须在sql中执行此操作,则可以构建如下查询:

    cols = ['first_name', 'last_name', 'middle_name']
    query = 'John Smith'
    sql_query = cols.map{|c| query.split.map{|q| "#{c} like '?'"}}.join(' OR ')
    sql_query_array = query.split * cols.count
    Student.where(sql_query, sql_query_array)
    

    我同意之前的建议,如果你需要做搜索,你应该看看Solr或Sphinx之类的东西

    不管怎样,这应该能帮到你

    def search
       query = params[:query].split.map {|term| "%#{term}%" }
       sql = "first_name LIKE ? OR middle_name LIKE ? OR last_name LIKE ?" 
    
      @students = Student.where([sql, *query])
    end
    
    第1步的答案是使用Ruby令人敬畏的小特性“splat操作符”,它允许您获取一个数组并将其作为参数列表进行计算


    步骤2的答案是只处理从参数返回的查询字符串,并将其转换为可以与LIKE运算符一起使用的内容。我基本上是从中偷来的。

    我不确定您是否希望所有字段都搜索相同的术语如果是这样的话,那么您可以这样做:

    where("first_name LIKE :term OR middle_name LIKE :term OR last_name LIKE :term", { term: "%#{params[:term]}%"})
    

    不需要任何疯狂的
    split
    map
    或其他任何东西,这只是直接的ActiveRecord

    注意SQL注入。很好。本来只是一个例子,但为了更安全,我更新了这个例子……我建议使用搜索。我只是尝试使用“LIKE”操作符,不记得是怎么回事了,你的回答帮了我不少忙。谢谢,亚当。