2017-07-12 20 views
1

生のクエリから何らかの形でJSON値をキャストするようにActiveRecordを設定できますか?ActiveRecord生クエリを使用したJSONキャスト

は、ここで私は、ハッシュ値としてキャストされる{"x": 1}結果を取得したいの例ですが、私は文字列を取得しています:

irb(main):017:0> ActiveRecord::Base.connection.select_value(%{SELECT '{"x": 1}'::json}) 
(0.2ms) SELECT '{"x": 1}'::json 
=> "{\"x\": 1}" 

irb(main):018:0> ActiveRecord::Base.connection.select_value(%{SELECT '{"x": 1}'::json}).class 
(0.2ms) SELECT '{"x": 1}'::json 
=> String 

は、JSON.parse('{"x": 1}')を提案しないでください。私はActiveRecordのアプローチが必要です。

+1

あなたは「私はActiveRecordのアプローチを必要とする」とはどういう意味ですか?結果をどうしようとしていますか?モデルはありますか?実際のクエリはどのように見えますか? –

+0

ActiveModelシリアライザJSONを試しましたか? 詳細はこちらhttp://api.rubyonrails.org/classes/ActiveModel/Serializers/JSON.html –

+0

@muistooshort私はActiveRecordレベルで何かが必要なだけで、PostgreSQL OIDなどをベースにした型キャストを実装することもできます。 ARを自動的に作成したいのですが。 – ole

答えて

0

低レベルのデータベースインターフェイスは、あなたがORMを使用していることを誰もが想定しているため、少し制限される傾向があります。しかし、ほとんどのデータベース処理ロジックがActiveRecord自体にあるので、ActiveRecordを使って作業をすることができます。

Model.select('2*3 as six') 

、あなたがsix属性を持っています取り戻すModelインスタンス:

ActiveRecordのクエリは、一般的に、あなたがのようなものを言うことができるようにと言ってモデルやテーブルが持っているものよりもクエリの結果と連携します。

これごまかしもfind_by_sqlに適用されます。

> Model.find_by_sql(%q{select '{"a":11}'::jsonb as pancakes}).first.pancakes 
=> {"a"=>11} 
> Model.find_by_sql(%q{select '{"a":11}'::jsonb as pancakes}).first.pancakes.class 
=> Hash 
関連する問題