【问题标题】:Search Results Rails SQL - Searching for users搜索结果 Rails SQL - 搜索用户
【发布时间】:2013-08-17 16:37:03
【问题描述】:

我的导航栏中有一个搜索字段,人们可以在其中搜索其他用户,例如 fb 的好友搜索。

在我的用户表中,我有 first_name 和 last_name 作为列,并且希望搜索结果可以浏览这两个表。现在我只使用名字。

@usersfiltered = User.where("first_name LIKE?", "%#{params[:first_name]}%" )

理想情况下,如果有一个名为 Bob Smith 的用户,当 Bob、Smith 或 Bob Smith 被搜索时,他的名字就会出现。

您将如何添加到 SQL 语句中?我已经尝试了一些东西,但不断收到错误。谢谢

【问题讨论】:

    标签: sql ruby-on-rails ruby


    【解决方案1】:

    您可以在 where 方法中使用符号为多个列传递一个值,如下所示:

    @usersfiltered = User.where("first_name LIKE :search_name or last_name LIKE :search_name", 
                                 search_name: "%#{params[:search_word]}%" )
    

    更新:

    要搜索first_namelast_name 的组合,您可以连接这两个字段并添加另一个OR 条件。

    这里的问题是不同的数据库有自己的连接风格。以下是 MySQL 和 Postgres。

    MySQL:

    @usersfiltered = User.where("first_name LIKE :search_name or last_name LIKE :search_name or concat(first_name, ' ', last_name) like :search_name", 
                                 search_name: "%#{params[:search_word].squish}%" )
    

    Postgres:

    @usersfiltered = User.where("first_name LIKE :search_name or last_name LIKE :search_name or (first_name || ' ' || last_name) like :search_name", 
                                 search_name: "%#{params[:search_word].squish}%" )
    

    我还添加了 Ruby 字符串函数 squish,以处理多余的空格。

    【讨论】:

    • 试过了,但如果我输入“bob smith”,它不会返回任何结果。有没有办法添加这个逻辑?
    【解决方案2】:
    @usersfiltered = User.where("first_name LIKE ? OR last_name LIKE ?", "%#{params[:first_name]}%", "%#{params[:last_name]}%")
    

    但是,如果您只有一个用户正在输入的字段,并且您想使用它来搜索多个名称,我认为您希望将其命名为“first_name”之外的其他名称,并使用中描述的方法另一个答案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-07
      相关资源
      最近更新 更多