我在postgres中使用jsonb数据类型来存储模型的各种变量设置。
使用哈希看起来非常简单。
如果我创建:
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 :(得分:0)
在这种情况下Model.create(settings:[{a:"b"}, {c:"d"}])
您可以通过以下方式查询:Model.where("settings @> ?", {a: "b"}.to_json)