2017-09-19 5 views
0

Widgetsモデルがあります。このモデルには、約3つのコアアクティブレコードがあります。値が存在し、xが等しいhstoreフィールドのクエリ

"{\"a\":1,\"b\":2}" 
{"a" => "1", "b" => "2", "product_type" => "1"}.to_json 

が、私はそのform_valuesキーaとその値が含まれて私は動作しませんでした何かを書いていた1

あるすべてのアクティブなレコードを照会する必要があります:1つの列の形式を持っている「form_values」と名付けられています、このような:

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

あなたが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 
) 

* ::整数は、文字列値をキャスト整数にする。レコードを照会するとき便利です。a > 2

関連する問題