2016-05-20 27 views
0

我是ROR的新手,嘗試使用Active Record在PostgreSQL數據庫中實現搜索。我發現要使搜索不區分大小寫,我可以使用ILIKE運算符而不是equalsLIKE,但不知道當我需要使用IN運算符時該怎麼辦。在Ruby on Rails和PostgreSQL中使用IN運算符進行大小寫不敏感搜索

我得到一個字段名和我需要檢查並區分大小寫的搜索就像是值的集合:

records = records.where(filter['fieldName'] => filter['value']) 

其中filter['value']是一個數組。

有沒有辦法更新該行,使其不區分大小寫?

如果沒有那麼我認爲唯一的辦法是遍歷數組和分裂IN成許多OR操作和陣列中使用ILIKE爲每一個值(但我不知道如何使用或與活動記錄) ?

謝謝!

+0

哪裏是從哪裏來的 「過濾器」 哈希值。看起來像SQLI容易受到我的影響。 您可以存儲已經在數據庫中縮減的值嗎? 你可以添加額外的索引嗎? –

+0

@pascalbetz過濾器是我通過其他應用程序通過REST發送的自定義結構的一部分。不幸的是我需要在數據庫中保留真實的情況,但我幾乎用下面的建議來解決它。 –

回答

0

這是對我工作:

records = records.where('"' + filter['fieldName'] + '"' + 
         " ILIKE ANY (array[?])", filter['value'].map {|value| "%#{value}%" }) 
+0

順便說一句,你應該避免使用特殊符號,假設'value'可能包含'%'。 – ndn

0

試試這個......

records.where("lower(#{filter['fieldName']}) in ?", filter['value'].map(&:downcase)) 

希望這會爲你工作。

+0

不使用任何索引...但應該工作。 –

+0

@pascalbetz,不知道應該如何使用'='而不是'in'。 – ndn

+0

@OlesMalkov你是對的。應該是「IN」而不是「=」。或者他可以使用「類似於」在這裏描述http://stackoverflow.com/questions/4928054/postgresql-wildcard-like-for-any-of-a-list-of-words –

2
records.where("lower(#{filter['fieldName']}) in (?)", filter['value'].map(&:downcase)) 
+0

看起來像你的答案是最接近的:)'records = records.where('''+ filter ['fieldName'] +'「'+」ILIKE ANY(array [?])「,filter ['value']。map {| value |」%#「 {value}%「})'這裏是爲我工作的。謝謝! –

+1

@OlesMalkov你應該發佈這個答案並接受它。 – ndn

相關問題