Voor dit antwoord is Postgres 9.4 vereist. In uw voorbeeldgegevensstructuur heeft u het volgende:
2.1.1 :202 > r.column_data
=> {"data1"=>[1, 2, 3], "data2"=>"data2-3", "array"=>[{"hello"=>1}, {"hi"=>2}]}
Helaas werkt het controleren op het bestaan van een element in een array alleen (voor zover ik weet) met stringwaarden. Als we de volgende gegevens hadden, zouden we deze zonder problemen kunnen opvragen.
{"data1"=>['1', '2', '3'], "data2"=>"data2-3"}
Laten we dit eens testen. Opmerking:de lading is jsonb. Het zal niet werken als een json-veld.
Dynamic.create(payload: {"data1"=>['1', '2', '3'], "data2"=>"data2-3"})
Dynamic.where("payload -> 'data1' ? '1'").first
=> #<Dynamic id: 8, payload: {"data1"=>["1", "2", "3"], "data2"=>"data2-3"}, created_at: "2014-12-24 02:30:31", updated_at: "2014-12-24 02:30:31">
Voor meer informatie kun je dit artikel