2016-06-03 37 views
9

Di the scarce instructions ho letto circa l'aggiunta di Postgres tipo di dati jsonb in una migrazione, che sta cercando in questo modo:Devo predefinito jsonb a '{}' o {} nella migrazione

create_table :ref_check_ins do |t| 
    t.jsonb :document, null: false, default: '{}' 
    t.index :document, using: :gin 
end 

Ma c'è qualche ragione contro l'impostazione predefinita di Hash intead of String, ovvero {} anziché '{}'?

Quando si definisce al tipo String, la classe di quella colonna:

String < Object 

Quando si definisce a Hash tipo, la classe di quella colonna:

Hash 

risposta

8

Nel file di migrazione, è 'intenzione di voler utilizzare il {} vs '{}'.

Mi sono letteralmente sforzato per un po 'di tempo, e il fatto è che penso che l'adattatore PG sappia implicitamente come convertire un hash in un oggetto jsonb. Non è come il tipo json nel DB postgres, dove stai memorizzando un valore stringa di un oggetto json, ma un vero oggetto binario (in jsonb). Probabilmente potrò cercarlo nel codice di rilascio di Rails 4.2 da qualche parte, ma, se stai cercando la documentazione sottile su di esso (che sto per aggiungere in un prossimo futuro), la chiave qui è che tu? in realtà ricevendo una stringa da Postgres quando si esegue '{}', e quindi quando si prova a indifferent_access, non riesce, perché una stringa non può avere accesso indifferente. Questo è stato probabilmente il mio primo capovolgimento che ci sono stati alcuni problemi con le informazioni che stavano fornendo.

Onestamente non usano la dritta {} comunque, favorendo [] sopra {}, perché di solito mi sto occupando funzionalità di registrazione molto specifico voglio esplicito su un disco senza dover unire due grandi tavoli insieme. Questo è il mio caso d'uso particolare qui su 5.0, e potrebbe essere un po 'diverso se sei < 5, ma probabilmente non di molto.