2016-02-03 48 views
1

說我有一個記錄在我的數據庫就像Rails4:有可能做一個可選的ActiveRecord搜索?

+----+-----------+----------+ 
| id | firstname | lastname | 
+----+-----------+----------+ 
| 1 | 'Bill' | nil  | 
+----+-----------+----------+ 

(注姓氏無)

有什麼,我可以使用下面的哈希結構作爲搜索參數獲取上述記錄:

vals = {firstname: "Bill", lastname: "test"} 
Table.where(vals) 

(即:找到最接近的匹配,忽略表中的零列值)

(我想檢查每科的y在哈希單獨和停止時發現匹配,但只是想知道是否有更有效的方式,特別是對於較大的表)

+1

如果你想模糊匹配,SQL是不是對的最佳工具工作。 – BroiSatse

+0

這現在可以在Rails 5中使用:http://stackoverflow.com/questions/32753168/rails-5-activerecord-or-query – maniacalrobot

回答

3

您可以進行自定義搜索。

def self.optional_where params 
    query_params = params.keys.map do |k| 
     "(#{k} = ? OR #{k} IS NULL)" 
    end.join(" AND ") 
    where(query_params, *params.values) 
end 

那麼你可以使用它像

Table.optional_where(vals) 

這將產生一個查詢

SELECT "tables".* FROM "tables" WHERE ((firstname = 'Bill' OR first_name IS NULL) AND (lastname = 'test' OR last_name IS NULL)) 
0

讓我們做一個自定義的搜索是這樣的:

scope :custom_search, -> (params) { 
    params.each do |k, v| 
    params[k] = if 
     if v.is_a? Array 
     (v << nil).uniq 
     else 
     [v, nil] 
     end 
    where(params) 
    end 
} 

然後我們使用它像:

search_params = {firstname: "Bill", lastname: "test"} 
Table.custom_search(search_params) 

生成的SQL將是:

SELECT * FROM tables where firstname IN ['Bill', null] AND lastname IN ['test', null] 

這意味着你不在乎,如果一個或多個字段是零

相關問題