2015-11-19 30 views
1

我有一個Contact模型。它具有屬性:first_namelast_name。用戶通過提示在搜索字段中輸入文本:輸入聯繫人的全名。然後Rails需要找到輸入名稱的所有聯繫人記錄LIKE。 下面是聯繫人記錄中的一個畫面:在Rails範圍內使用Concat

Picture of records within the Contact Table

- 如果在「JOE」的用戶類型,然後Rails會返回兩個記錄(因爲它是不區分大小寫)

- 如果用戶類型在「joe s」中,軌道將返回兩條記錄

- 如果用戶鍵入「doe」,那麼rails將返回一條記錄。

#models/contact.rb 
class Contact < ActiveRecord::Base 
    scope :by_entered_name, -> (full_name){where("CONCAT('first_name',' ','last_name') LIKE ?", full_name)} 
end 

生成的SQL當我在軌運行控制檯Contact.by_entered_name("joe")

SELECT "contacts".* FROM "contacts" WHERE (CONCAT('first_name',' ','last_name') LIKE 'joe' 

我用mysql的情況下的細節是非常重要的。然而,對於這個示例應用程序,我使用的是sqlite,它引發了一個語法錯誤。最重要的是我得到這個在MySQL上工作。

更新:有人表示我的問題不清楚。我的問題是:

如何正確地創建一個查詢這需要由用戶輸入的文本,並找到所有contacts其串聯first_namelast_nameLIKE由用戶提交的文本?我也需要它不區分大小寫。我上面的嘗試範圍似乎不起作用。

+0

所以......你的問題是什麼? – sevenseacat

+0

已閱讀https://dev.mysql.com/doc/refman/5.7/en/string-comparison-functions.html,但答案只是將'full_name'更改爲'「%#{full_name}% 「'以便它匹配任何包含搜索查詢的名稱 – jvnill

+0

@sevenseacat我更新了我的原始問題。希望這更清楚。 – Neil

回答

3

有一些你不需要的引號。並且您需要參數中的通配符%。另外,需要ILIKE來忽略Postgres的情況。

class Contact < ActiveRecord::Base 
    scope :by_entered_name, -> (full_name){where("CONCAT(first_name,' ',last_name) ILIKE ?", "%#{full_name}%")} 
end 
+0

Nitpick,但我會將其更改爲LIKE%?%,而不是將其與輸入 – ObjectNameDisplay

0

SQLite不使用CONCAT功能,它採用||作爲連接運算符。 Swards的答案會讓你進入MySQL。