2016-06-07 146 views
2

我在postgres中使用jsonb數據類型來存儲模型的各種變量設置。在jsonb postgres中使用activerecord查詢哈希值的嵌套數組

隨着哈希看起來非常簡單。

如果我創建:

Model.create(settings:{a:"b", c:"d"}) 
Model.where("settings -> 'a' ? 'b'") #or 
=> Model... 
Model.where("settings -> 'c' ? 'd'") #or if I just want to check the keys 
=> Model... 
Model.where("settings ? 'a'") 
=> Model... 

如果我做一些稍微複雜與多發鍵:

Model.create(settings:{a:{b:"c", d:"e"}}) 

Model.where("settings -> 'a' ? 'b' ") #or 
=> Model... 
Model.where("settings -> 'a' ? 'd' ") 
=> Model... 

做同樣

現在,如果我把一個數組在頂層,我可以做以下事情:

Model.create(settings:["a","b"]) 
Model.where("settings ? "a") 
=> Model... 

並獲取返回的對象。使用嵌套數組。

Model.create(settings:{a:["a","b"]}) 
Model.where("settings -> 'a' ? 'a'") 
=> Model... 
Model.where("settigns -> 'a' ? :v", v: 'a') 
=> Model... 

但是,只要我在該數組中放置了更復雜的東西,我就再也看不到匹配了。

Model.create(settings:[{a:"b"}, {c:"d"}]) 
Model.where("settings ? :v", v: {a:"b"}) 
=> [] 
Model.create(settings:{a:[{b:"c"}, {d:"e"}]}) 
Model.where("settings -> 'a' ? :v", v: {b:"c"}) 
=> [] 

全部無法返回對象。

我想讓我可以查詢嵌套數組的元素是否在其包含的哈希中包含某些鍵,但我無法解決此問題。 我明顯錯過了語法上的某些東西,但我無法弄清楚它是什麼。

回答

0

在這種情況下Model.create(settings:[{a:"b"}, {c:"d"}])

可以查詢這樣說:Model.where("settings @> ?", {a: "b"}.to_json)