2016-02-10 16 views
5

假設我有一個模型User,它有一個json類型的字段,稱爲settings。讓我們假設這個領域看起來大致是這樣的:如何僅選擇部分json,存儲在Postgres中,使用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'的Custom **列不知道在表內,因此它們不會被打印出來,但是[映射到不管](http://stackoverflow.com/questions/34701667) /在那裏-DO-WE-聲明的屬性對的一護欄模型/ 34705079#34705079)。 –

回答

6

嘗試User.select("settings -> 'language' as user_language")。 生成的關係中的每個對象都應該響應user_language

+0

輝煌,謝謝:) –

+0

乾杯!樂於幫助。順便說一句 - 似乎沒有用'as user_language'命名選定的值,結果將仍然包含該值,但在一個奇怪的'?列'鍵下。 – Dani

+0

你介意看看這個問題[如何在選擇時排除部分json,存儲在Postgres中,使用ActiveRecord?](http://stackoverflow.com/questions/35314920/how-to-exclude-parts- of-json-when-selecting-stored-in-postgres-using-activerec) –

相關問題