2017-02-14 75 views
3

設置:Rails + Postgres。如何在rails中找到列值= [給定數組]的記錄

我有列

id: int, name: string, address: string, s_array: varchar[], i_array: int[], created_at: datetime) 

對於行的表A,我需要找到所有具有類似值的行。 在軌,然後查詢看起來像

row = A.find(1) # any random row 
ignore_columns = %w[id created_at] 
A.where(row.attributes.except(*ignore_columns)) 

,如果我們沒有與數組類型的列這工作。 如何查找值爲[給定數組]的所有記錄?

編輯: 要清楚,我想在where子句中傳遞多個列,其中某些列是數組類型。對於其中子句中值,我傳遞散列(row.attributes.except(* ignore_columns)是哈希)

編輯2:實施例:

可以說我有一個查詢表

Query(id: Int, name: String, terms: varchar[], filters: int[], city: string, created_at: datetime) 

id = primary key/integer 
terms = array of string 
filters = array of integer (it is an enum and we can select multiple which is saved as array) 
other fields = self explanatory 

假設我有以下行

(1, "query1", ["john"], [0], "wall", <some_date>) 
(1, "query2", ["eddard", "arya"], [0, 1], "Winterfell", <some_date>) 
(1, "query3", ["sansa", "arya"], [1, 2], "Winterfell", <some_date>) 

現在,當我添加新行

row = ActiveRecord of (1, "query4", ["eddard", "arya"], [0, 1], "Winterfell", <some_date>) 

我想是搜索已經存在的記錄是這樣

ignore_attributes = %w[id name created_at] 
Query.where(row.attributes.except(*ignore_attributes)) 

此查詢應該返回已有QUERY3這樣我就不需要與名query4添加新行。

問題是,因爲某些列類型是數組類型,然後將它們作爲散列/條件傳遞給where子句不起作用。

+0

在檢查並點擊插入查詢之前,您需要忽略哪些列。 – Milind

+0

上面定義的ignore_attributes數組中的那些。 – chinmayv

回答

0

你在鐵軌查詢類似於下面

row = A.find(1) 

where_clauses = row.attributes.reject{|k,v| %[id, created_at].include?(k)} 

A.where(where_clauses) 
+0

沒有得到你想說的話。你上面寫的和我的問題一樣。 – chinmayv

0

試試這個例子: -

##black list of attributes 
    ignore_attributes = %w[id name created_at] 

    MyModel.where(active: true).select(MyModel.attribute_names - ignore_attributes) 

    =====The above query can also be chained as:- ===== 

    ##you have a city column too 
    MyModel.where(active: true).select(MyModel.attribute_names - ignore_attributes).where.not(:city=>["Sydney","London"]) 

如果您需要這一個永久性的修復,你可以在你model.rb文件中加入這一行。 但它很危險。

self.ignored_columns = %w(id name created_at) 

希望它能幫助:)

+0

謝謝,但我不想通過單個列查找,我想在where子句中傳遞多個值的散列(澄清同一問題) – chinmayv

+0

可以分享任何示例...將盡力幫助您嗎?) – Milind

+0

在問題中添加了示例@milind – chinmayv

0

使用find_by到find_all_by,它會返回所有匹配的結果。

相關問題