我有一个Widgets
模型,它有大约3个核心活动记录。一列名为'form_values',其格式为:
"{\"a\":1,\"b\":2}"
{"a" => "1", "b" => "2", "product_type" => "1"}.to_json
我需要查询其form_values包含键a
并且其值为1的所有活动记录。
我写了一些不起作用的东西,比如:
required_widgets = Widget.find_by_sql("select id from (select id, form_values from widgets where form_values!= '' and form_values::jsonb?'' and form_values::json->>'product_type' = '1') as required_widgets where (form_values::json->'a')::jsonb?'1' ")
答案 0 :(得分:0)
如果你使用的是postgresql支持的hstore
data type,那就很容易了:
您的两个用例都是described in the docs
1:检查是否定义了值
hstore?文本
所以对于你的用例
form_values::hstore ? 'a'
2:选择(并比较)一个值
hstore - >文本
所以对于你的用例
form_values -> product_type
# this returns '1'
3:将它们添加到查询中
SELECT * FROM widgets
WHERE form_values::hstore ? 'a'
AND (form_values -> a)::integer = 1
您也可以将其中的部分内容包装到ActiveRecord中:
Widget.where(
form_values::hstore ? 'a'
AND (form_values -> a)::integer = 1
)
* :: integer 将字符串值强制转换为整数。查询a > 2