2016-06-03 4 views
9

Of the scarce instructions ich über das Hinzufügen von Postgres Datentyp jsonb in einer Migration gelesen habe, ist es wie folgt aussehen:Soll ich jsonb standardmäßig {} oder {} in der Migration

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

Aber gibt es keinen Grund gegen den Standard zu Hash Intade von String, dh {} anstelle von '{}'?

Bei der Definition es String-Typ, die Klasse dieser Spalte:

String < Object 

Bei der Definition es Typ Hash, die Klasse dieser Spalte:

Hash 

Antwort

8

In der Migrationsdatei, Sie Ich werde die {} vs '{}' verwenden wollen.

Ich habe buchstäblich nur für eine Weile gekämpft, und die Sache ist, dass ich glaube, dass der PG-Adapter implizit weiß, wie man einen Hash in ein Jsonb-Objekt konvertiert. Es ist nicht wie der JSON-Typ in der Postgres DB, wo Sie einen String-Wert eines JSON-Objekts speichern, sondern ein tatsächliches Binärobjekt (in JSONB). Ich kann es wahrscheinlich irgendwo im Rails 4.2 Release Code ausgraben, aber wenn Sie die dünne Dokumentation darauf suchen (der ich in naher Zukunft hinzufügen werde), ist der Schlüssel hier, dass Sie Re tatsächlich bekommen eine Zeichenfolge zurück aus Postgres, wenn Sie '{}' tun, und damit, wenn Sie versuchen, indifferent_access es, es scheitert, weil eine Zeichenfolge nicht gleichgültig zugreifen kann. Das war wahrscheinlich mein erster Heads-Up, dass es einige Probleme mit den Informationen gab, die sie zur Verfügung stellten.

Ich ehrlich die gerade nicht {} sowieso up verwenden, [] über {} begünstigt, weil in der Regel zusammen zwei große Tische verbinden ich sehr spezifische Logging-Funktionalität Handhabung I ohne auf einen Datensatz explizit wollen. Das ist mein besonderer Anwendungsfall hier auf 5.0, und es könnte ein bisschen anders sein, wenn Sie < 5 sind, aber wahrscheinlich nicht viel.

Verwandte Themen