我有一个带有字符串和json属性的Contact模型 string属性存储phone_number,json属性存储其他一些数据。
我想运行像这样的查询
Contact.exists?(phone_number: '+255788778899', data: {name: 'Gamma',
region: 'The Great one'})
我已经搜遍了所有谷歌和SO,但大多数文章简单给出了一种方法,只用一个json字符串找到记录,只有一个键
例如
Contact.exists?("data ->> 'name' = 'Gamma'")
但我的意图是查找电话号码是否存在联系人以及同一查询中指定的完整json属性
我该怎么做?
答案 0 :(得分:1)
实现目标的一种方法是使用where
和present?
代替exists?
。例如:
Contact.where("data ->> 'name' = 'Gamma' AND phone_number = '+255788778899'").present?
这种方法的另一个好处是,如果你要使用集合/对象,如果它确实存在,那么你可以先运行查询:
@contacts = Contact.where("data ->> 'name' = 'Gamma' AND phone_number = '+255788778899'")
然后,检查它的存在不会再次访问数据库:
@contacts.present?
<强>更新强>
如果您需要在查询中使用变量,则可以这样做,但请务必将它们用引号括起来。例如:
name = 'Gamma'
phone = '+255788778899'
Contact.where("data ->> 'name' = '#{name}' AND phone_number = '#{phone}'")
答案 1 :(得分:0)
用这样的where子句链接它怎么样:
Contact.where(phone_number: '+255788778899').exists?("data ->> 'name' = 'Gamma'")