搜索结果Rails SQL - 搜索用户

时间:2013-08-17 16:37:03

标签: sql ruby-on-rails ruby

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

在我的Users表中,我将first_name和last_name作为列,并希望搜索结果能够查看这两个表。现在我只是使用第一个名字。

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

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

您将如何添加SQL语句?我尝试过一些东西,但不断出错。感谢

2 个答案:

答案 0 :(得分: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,以处理额外的空格。

答案 1 :(得分:0)

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

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