2016-02-10 5 views
5

Dire che ho un modello User, che ha un campo di tipo chiamato settings. Supponiamo che questo campo sembra più o meno in questo modo:Come selezionare solo parte di json, memorizzato in Postgres, con ActiveRecord

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

Se lo faccio User.select(:settings) mi metterò tutte le impostazioni per ogni utente. Ma voglio ottenere solo le lingue per un utente. Ho provato entrambe:

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

e

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

ma questo restituisce solo oggetti vuoti:

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

E` a tutto il possibile? Se sì, posso farlo usando solo json o devo passare a jsonb?

+2

* oggetti vuoti * - sicuro? Prova a fare '.map (&: attributes)' sul risultato. –

+0

Hai ragione. 'attributes' restituisce questo' {"id" => nil, "? column?" => "English"} '. Ciò che mi ha confuso è il fatto che normalmente l'oggetto sarebbe simile a questo quando si seleziona un attributo normale (non json): '# '. Tuttavia, apparentemente i dati selezionati da JSON non funzionano così. –

+1

È solo "# to_s" che è definito in un modo che emette solo ** colonne ** conosciute. ** Le colonne personalizzate ** di 'select' non sono contenute nella tabella, quindi non vengono stampate in' # to_s', ma sono [mappate indipendentemente] (http://stackoverflow.com/questions/34701667/dove-fai-da-noi di dichiarazione-attributi-di-un-rails-modello/34705079 # 34705079). –

risposta

6

Prova User.select("settings -> 'language' as user_language"). Ogni oggetto nella relazione risultante dovrebbe rispondere a user_language.

+0

Brillante, grazie :) –

+0

Saluti! Felice di aiutare. BTW - sembra che senza nominare il valore selezionato con un 'come user_language' il risultato includa comunque il valore ma sotto una strana chiave' 'column?'. – Dani

+0

Ti piace anche dare un'occhiata a questa domanda [Come escludere parti di json quando selezioni, memorizzato in Postgres, usando ActiveRecord?] (Http://stackoverflow.com/questions/35314920/how-to-exclude-parts- of-json-when-selection-stored-in-postgres-using-activerec) –

Problemi correlati