Angenommen, ich habe ein Modell User
, das ein Feld vom Typ json
namens settings
hat. Nehmen wir an, dass dieses Feld in etwa wie folgt aussieht:So wählen Sie nur einen Teil von JSON, gespeichert in Postgres, mit ActiveRecord
{
color: 'red',
language: 'English',
subitems:
{
item1: true,
item2: 43,
item3: ['foo', 'bar', 'baz']
}
}
Wenn ich ich für jeden Benutzer alle Einstellungen erhalten tun User.select(:settings)
. Aber ich möchte nur die Sprachen für einen Benutzer bekommen. Ich habe versucht, beide:
User.select("settings -> 'language'")
und
User.select("settings ->> 'language'")
aber dies gibt nur leere Objekte:
[#<User:0x007f381fa92208 id: nil>,
...]
Ist das überhaupt möglich? Wenn ja - kann ich es nur mit json
oder muss ich auf jsonb
wechseln?
* leere Objekte * - sicher davon? Versuchen Sie '.map (&: attributes)' auf dem Ergebnis. –
Sie haben Recht. 'attributes' gibt diese' {"id" => nil, "? Spalte?" => "English"} 'zurück. Was mich verwirrte, ist die Tatsache, dass das Objekt normalerweise so aussehen würde, wenn man ein normales (nicht json) Attribut auswählt: '#'. Scheinbar json ausgewählte Daten funktionieren jedoch nicht so. –
Es ist nur '# to_s', das so definiert ist, dass nur ** bekannte ** Spalten ausgegeben werden. ** Benutzerdefinierte ** Spalten von 'select' befinden sich nicht in der Tabelle, daher werden sie nicht in' # to_s' ausgedruckt, sondern sind [unabhängig] (http://stackoverflow.com/questions/34701667)/where-do-we-declare-Attribute-of-a-rails-model/34705079 # 34705079). –