2013-08-17 203 views
0

我在我的导航栏中有一个搜索字段,用户可以在其中搜索其他用户,例如fb的朋友搜索。搜索结果Rails SQL - 搜索用户

在我的用户表中我有first_name和last_name作为列,并希望搜索结果通过这两个表。现在我只是用名字工作。

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

理想的情况下,如果有一个名为鲍勃史密斯的用户他的名字会来了,如果鲍勃·史密斯,或鲍勃·史密斯被搜查。

你将如何去添加到SQL语句?我尝试了一些东西,但不断收到错误。由于

回答

1

您可以在其中,方法在一个价值传递了这样的多列使用符号:

@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,采取额外空间的照顾。

+0

试过这个,但如果我输入“bob史密斯”,它不会返回任何结果。有没有办法添加这个逻辑? – brad

+0

@brad,请参阅更新。 – vee

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

但是,如果你只有一个字段,用户键入到,你想用它来搜索多个名字,我想你会想它命名为除了“FIRST_NAME”和使用别的东西在另一个答案中描述的方法。