https://github.com/rails/rails/pull/45783
検証するコードはこちら
PostgreSQLでテーブルを用意してデータを入れる
ActiveRecord::Base.connection.create_table("json_data_type") do |t|
.public_send :json, "payload", default: {} # t.json 'payload', default: {}
t.public_send :json, "settings" # t.json 'settings'
t.public_send :json, "objects", array: true # t.json 'objects', array: true
tend
def insert_statement_per_database(values)
"insert into json_data_type (payload) VALUES ('#{values}')"
end
ActiveRecord::Base.connection.execute(insert_statement_per_database('{"a":{},"b":"b"}'))
その上で下記の処理を実行する
JsonDataType.class.pluck(Arel.sql("payload->'a', payload->>'b'"))
JsonDataType Pluck (3.0ms) SELECT payload->'a', payload->>'b' FROM "json_data_type"
=> [["{}", "b"]]
上記のように{}にダブルクオーテーションがついた形になる
JsonDataType Pluck (1.4ms) SELECT payload->'a', payload->>'b' FROM "json_data_type"
=> [[{}, "b"]]
一方こちらでは上記のように{}にはダブルクオーテーションがつかない形になっている
PostgreSQLを使っていて->と->>を併用している部分がある場合は気にしたほうが良さそう。