2015-02-07 5 views
9

Sto cercando di utilizzare la nuova funzionalità di jsonb in Rails4.2 e Postgres4.1.Come lavorare con il modulo rails e jsonb postgres

Stavo cercando di creare un modello che rappresenta un profilo utente (cioè set di abilità, ecc.) E di archiviare tutto in un unico set di dati jsonb.

Così il tavolo avrebbe:

id int 
profile jsonb 
timestamps 

stavo pensando che potrei fondamentalmente memorizzare tutti i dati del profilo nella struttura jsonb come segue (questo è solo un esempio/concetto):

{ 
    "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" 
    }], 
} 

La mia domanda è: come creerei un modulo di base per le rotaie che scriverebbe/leggerebbe su questa struttura? Capisco come farlo con un set relazionale tradizionale di tabelle, ma non sono sicuro di come avvicinarmi quando tutto potrebbe andare in una struttura flessibile come quella qui sotto?

Cosa accadrebbe nel _form.html.erb e nel controller azioni new/create/edit?

+0

Sono nella stessa situazione. Hai trovato qualche soluzione? – medBo

risposta

5

Utilizzare store_accessors. I dati del modulo sono solo uno Hash, che può essere facilmente convertito in un oggetto JSON e persistono in postgresql senza grossi problemi.

Assumendo che il modulo fa valere tutti i dati del profilo in un profile[] hash ei tuoi modelli simile a questo:

class User < ActiveRecord::Base 
    has_one :profile 
end 

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

si può semplicemente fare qualcosa di simile:

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

Nel vostro controller (o in qualsiasi altro) e dovrebbe funzionare.

+0

fantastico! eventuali aspetti negativi o trucchi da tenere d'occhio? – cman77

+1

@ cman77 Rails sta facendo un sacco di serializzazione/deserializzazione per te senza che tu lo sappia. Come al solito con Rails, quando funziona sembra magica, ma potrebbe causare qualche problema. Fai attenzione alle strutture dati non convenzionali. Tuttavia, tutto ciò che può essere serializzato in modo sicuro in JSON dovrebbe funzionare bene. – lsdr