2016-02-10 28 views
5

ile PostGres'te depolanan jsonun yalnızca bir kısmı nasıl seçilir? türünde settings adı verilen bir modele sahip olduğum bir Model User. en bu alan kabaca şöyle düşünelim:ActiveRecord

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

ben User.select(:settings) yaparsanız ben her kullanıcı için tüm ayarları alacaktır. Ama sadece bir kullanıcı için dil almak istiyorum.

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

ve

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

ama bu sadece döner boş nesneler:

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

bu hiç mümkün mü ben hem çalıştı? Varsa - sadece json'u kullanarak yapabilir miyim veya jsonb'a geçmem gerekiyor mu?

+2

* boş nesneler * - bundan emin misiniz? Sonuçta '.map (&: attributes)' yapmayı deneyin. –

+0

Haklısınız. 'attributes' bu değeri döndürür: {"id" => nil, "? column?" => "English"} '. Beni şaşırtmış olan şey normal bir nesnenin normal (json değil) bir öznitelik seçerken böyle görünmesidir: '# '. Ancak, görünüşe göre json seçilmiş veriler bu şekilde çalışmıyor. –

+1

Sadece ** bilinen ** sütunları çıkaran bir şekilde tanımlanmış olan '' to ''. ** 'select''den gelen özel ** sütunların tablo içinde olduğu bilinmemekte, bu nedenle # to_s' biçiminde yazdırılmamaktadırlar, ancak [mapped regardless] (http://stackoverflow.com/questions/34701667) /-of-the nerede-do-biz-beyan-öznitelikleri-raylar-model/34705079 # 34705079). –

cevap

6

User.select("settings -> 'language' as user_language") ürününü deneyin. Ortaya çıkan ilişkideki her nesne user_language'a yanıt vermelidir.

+0

Parlak, teşekkürler :) –

+0

Şerefe! Memnuniyetle yardım ettim. BTW - görünen değeri bir "user_language" ile isimlendirmeksizin sonuç yine de bir tuhaf '? 'Sütun? – Dani

+0

Bu soruya bir göz atmayı düşünüyor musunuz [Seçme, Postgres'te saklanan ActiveRecord'u kullanarak json bölümlerini nasıl hariç tutabilirim?] (Http://stackoverflow.com/questions/35314920/how-to-exclude-parts- json-seçildiğinde-kaydedilmiş-postgres-using-activerec) –