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
?
* oggetti vuoti * - sicuro? Prova a fare '.map (&: attributes)' sul risultato. –
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ì. –
È 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). –