2012-08-02 81 views
2

UsersController指數:軌與jQuery令牌輸入:第一個字符搜索忽略

@users = current_user.other_users.where("first_name like ?", "%#{params[:q]}%") 

1)搜索能正常工作在文本字段中,除了未檢測到第一個字符。例如:如果我用「J」搜索「John」,我不會得到任何結果,但是如果我做「o」,我會像我應該那樣得到「John」。

2)我想知道如何爲last_name添加一個額外的搜索條件...? 我覺得像

.where("first_name like ? or last_name like ?", "%#{params[:q]}%") 

會的工作,但它不...

幫助讚賞!

+0

您使用的數據庫是?也許(儘管我不知道爲什麼會出現這種情況,但它違背了我能找到的所有文檔),搜索中的'%'字符不匹配零長度。這意味着''%J%「'不會匹配以J開頭的名稱,因爲它需要前面有另一個字符。您的查詢是否與名稱中最後一個字符的字母匹配? – 2012-08-13 15:18:54

+0

有趣的想法!我正在使用Postgres。查詢成功匹配名稱中最後一個字符的字母。 – dmonopoly 2012-08-13 18:24:17

+0

如果你能匹配名字的最後一個字母,那麼我的建議很可能不是問題的原因。但是你可以嘗試從where子句中刪除第一個'%',看看會發生什麼。 – 2012-08-13 19:41:22

回答

3

我打賭你在使用Postgres作爲數據庫,其中LIKE子句區分大小寫。要搜索不區分大小寫的Postgres的:

.where("first_name ILIKE ? or last_name ILIKE ?", "%#{params[:q]}%") 

這SO有很多背景:How do you write a case insensitive query for both MySQL and Postgres?

其他替代方案:

+0

這是做到了 - 謝謝!我還要感謝@davidrac在#2上的幫助。 – dmonopoly 2012-08-14 01:52:04

1
  1. 我不知道爲什麼這不匹配。也許你應該添加' '周圍的參數:"first_name like '?'"

  2. 我想你應該在那裏有兩個參數:

。凡( 「?FIRST_NAME喜歡或姓氏LIKE」,「%#{PARAMS [:q]}%「,」%#{params [:q]}%「)

+1

1不好 - 把''放在'只是不讓搜索工作。然而,2的作品很棒 - 非常感謝! (如果你想出另一個想法1,請讓我知道) – dmonopoly 2012-08-02 16:17:45

0

第一個字母沒有被檢測到的原因是因爲您有一個名字列的前面和後面在where語句中。所以,因爲J之後什麼也沒有,那麼這就是爲什麼%John%不起作用。

您將需要查找語句之前和之後。

這會工作。

q1 = params[:q].to_s + '%' 
q2 = '%' + q1 
where(["first_name LIKE ? OR last_name LIKE ? OR first_name LIKE ? OR last_name LIKE", q1,q1,q2,q2]) 

然後在您的SQL語句中放入UNIQUE以使它們成爲唯一的行。

因爲LIKE操作沒有爲前後操作編制索引(只有前面),所以最好使用全文搜索索引來處理這種東西。假設你使用MySQL作爲數據庫後端。