2013-08-17 305 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」和使用別的東西在另一個答案中描述的方法。