2016-02-10 5 views
5

Userというモデルがあり、フィールドにというjsonというフィールドがあるとします。のは、このフィールドは、おおよそ次のようになりますと仮定しましょう:Postgresに保存されているjsonの一部のみをActiveRecordで保存する方法

{ 
    color: 'red', 
    language: 'English', 
    subitems: 
    { 
     item1: true, 
     item2: 43, 
     item3: ['foo', 'bar', 'baz'] 
    } 
} 

私はUser.select(:settings)をすれば、私は、各ユーザーのすべての設定を取得します。しかし、私はユーザーのための言語だけを取得したい。

User.select("settings -> 'language'") 

User.select("settings ->> 'language'") 

が、これは単に空のオブジェクトを返します:私は両方を試してみました

[#<User:0x007f381fa92208 id: nil>, 
...] 

は、すべての可能で、このですか?はいの場合 - ちょうどjsonを使用して行うことができますか、jsonbに切り替える必要がありますか?

+2

*空のオブジェクト* - 確かに?結果に '.map(&:attributes)'を実行してみてください。 –

+0

あなたは正しいです。 'attributes'はこの' {"id" => nil、 "?column?" => "English"} 'を返します。私を混乱させたのは、普通の(jsonではない)属性を選択するとオブジェクトが通常次のようになるという事実です: '#。しかし、明らかにjsonの選択されたデータはそのようには機能しません。 –

+1

**既知の**列のみを出力する方法で定義された '#to_s'です。 ** 'select'のカスタム**カラムはテーブルの中にあるとは知られていないので、'#to_s'では表示されませんが、[関係なくマップされます](http://stackoverflow.com/questions/34701667)/where-do-we-declare-attributes-of-a-rails-model/34705079#34705079)。 –

答えて

6

お試しUser.select("settings -> 'language' as user_language") 結果の関係にある各オブジェクトは、user_languageに応答する必要があります。

+0

華麗な、ありがとう:) –

+0

乾杯!お力になれて、嬉しいです。 BTW - 選択された値に 'as user_language'という名前を付けることなく、結果にはまだ値が含まれますが、奇妙な'?column? 'キーの下にあるようです。 – Dani

+0

あなたはこの質問を見ても大丈夫ですか?[ActiveRecordを使って、Postgresに保存されているjsonの部分を除外する方法](http://stackoverflow.com/questions/35314920/how-to-exclude-parts-ポストグラム使用中レックに保存されています) –

関連する問題