0

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

在我的 Users 表中,我将 first_name 和 last_name 作为列,并且希望搜索结果同时查看这两个表。现在我只是让它与名字一起工作。

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

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

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

4

2 回答 2

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来处理多余的空格。

于 2013-08-17T16:54:00.740 回答
0
@usersfiltered = User.where("first_name LIKE ? OR last_name LIKE ?", "%#{params[:first_name]}%", "%#{params[:last_name]}%")

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

于 2013-08-17T16:54:11.280 回答