我的导航栏中有一个搜索字段,人们可以搜索其他用户,例如fb的朋友搜索。
在我的Users表中,我将first_name和last_name作为列,并希望搜索结果能够查看这两个表。现在我只是使用第一个名字。
@usersfiltered = User.where("first_name LIKE?", "%#{params[:first_name]}%" )
理想情况下,如果有一个名为Bob Smith的用户,如果Bob,Smith或Bob Smith被搜查,他的名字就会出现。
您将如何添加SQL语句?我尝试过一些东西,但不断出错。感谢
答案 0 :(得分:1)
您可以在where方法中使用符号为多列传递一个值,如下所示:
@usersfiltered = User.where("first_name LIKE :search_name or last_name LIKE :search_name",
search_name: "%#{params[:search_word]}%" )
<强>更新强>
要搜索first_name
和last_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”之外,您还要将其命名为其他名称并使用另一个答案。