2015-02-07 8 views
9

Czekam na wykorzystanie nowej możliwości jsonb w Rails4.2 i Postgres4.1.Jak pracować z formularzami szyn i jsonb postgres

Szukałem przy tworzeniu modelu, który reprezentuje profil użytkownika (tj. Zestawy umiejętności, itp.) I przechowywania całość w jednym zestawie danych jsonb.

więc tabela musiałby:

id int 
profile jsonb 
timestamps 

Myślałam mogłem zasadzie przechowywać wszystkie dane profilu w strukturze jsonb następująco (jest to tylko przykład/concept):

{ 
    "basics": { 
    "name": "John Doe", 
    "label": "Programmer", 
    "picture": "", 
    "email": "[email protected]", 
    "phone": "(912) 555-4321", 
    "website": "http://johndoe.com", 
    "summary": "A summary of John Doe...", 
    "location": { 
     "address": "2712 Broadway St", 
     "postalCode": "CA 94115", 
     "city": "San Francisco", 
     "countryCode": "US", 
     "region": "California" 
    }, 
    "profiles": [{ 
     "network": "Twitter", 
     "username": "john", 
     "url": "http://twitter.com/john" 
    }] 
    }, 
"skills": [{ 
    "name": "Web Development", 
    "level": "Master", 
    "keywords": [ 
     "HTML", 
     "CSS", 
     "Javascript" 
    ] 
    }], 
    "languages": [{ 
    "language": "English", 
    "fluency": "Native speaker" 
    }], 
} 

Moje pytanie brzmi: jak utworzyć podstawowy formularz szyny, który zapisał/odczytałby tę strukturę? Rozumiem, jak to zrobić w tradycyjnym relacyjnym zestawie tabel, ale nie jestem pewien, jak podejść do niego, gdy wszystkie mogą wejść w elastyczną strukturę, jak na przykład poniżej.

Co by się stało przy akcji _form.html.erb i kontrolerach new/create/edit?

+0

Jestem w tej samej sytuacji. Czy znalazłeś jakieś rozwiązanie? – medBo

Odpowiedz

5

Użyj store_accessors. Dane formularza to tylko Hash, które można łatwo przekonwertować na obiekt JSON i zachowane w postgresql bez większych problemów.

Zakładając swoją formę utrzymuje wszystkie dane profilu w profile[] hash i twoi modele mniej więcej tak to wygląda:

class User < ActiveRecord::Base 
    has_one :profile 
end 

class Profile < ActiveRecord::Base 
    belongs_to :user 
    store_accessor :profile 
end 

Można po prostu zrobić coś takiego:

user.profile = params[:profile] 
user.profile.save 

W kontrolerze (lub gdziekolwiek poza tym) i powinno działać.

+0

niesamowite! jakieś wady lub głupie, na które trzeba uważać? – cman77

+1

@ cman77 Rails robi wiele serializacji/deserializacji dla ciebie bez twojej wiedzy. Jak zwykle w Railsach, kiedy to działa, wygląda jak magia, ale może powodować pewne problemy. Uważaj na niekonwencjonalne struktury danych. Wszystko, co można bezpiecznie serializować na JSON, powinno jednak działać dobrze. – lsdr

Powiązane problemy