2016-02-10 4 views
5

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?

+2

* leere Objekte * - sicher davon? Versuchen Sie '.map (&: attributes)' auf dem Ergebnis. –

+0

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. –

+1

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). –

Antwort

6

Versuchen Sie User.select("settings -> 'language' as user_language"). Jedes Objekt in der resultierenden Beziehung sollte auf user_language antworten.

+0

Brilliant, danke :) –

+0

Prost! Freue mich zu helfen. BTW - es scheint, dass, ohne den ausgewählten Wert mit einer 'as user_language' zu ​​benennen, das Ergebnis immer noch den Wert enthält, aber unter einer seltsamen'? Spalte? 'Taste. – Dani

+0

Haben Sie etwas dagegen, sich diese Frage anzusehen [Wie können Teile von json bei der Auswahl ausgeschlossen werden, die in Postgres mit ActiveRecord gespeichert werden?] (Http://stackoverflow.com/questions/35314920/how-to-exclusion-parts-) von-json-wenn-Auswahl-gespeichert-in-Postgres-using-activerec –

Verwandte Themen