2016-06-03 5 views
9

Из the scarce instructions я прочитал о добавлении типа jsonb данных Postgres в миграции, это выглядит так:Должен ли я по умолчанию jsonb на «{}» или {} в миграции

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

Но есть ли причина против дефолта с Hash intead String, то есть {} вместо '{}'?

При определении его типа String, класс этой колонки:

String < Object 

При определении его Hash тип, класс этой колонки:

Hash 

ответ

8

В файле миграции, вы '' собирается хотеть использовать {} против '{}'.

Я буквально как-то боролся с этим некоторое время, и дело в том, что я думаю, что адаптер PG неявно знает, как преобразовать хэш в объект jsonb. Это не похоже на тип json в базе данных postgres, где вы храните строковое значение объекта json, но фактический двоичный объект (в jsonb). Вероятно, я могу его скопировать в код выпуска Rails 4.2, но если вы посмотрите на то, что тонкая документация на нем (которую я собираюсь добавить в ближайшем будущем), ключ здесь заключается в том, re фактически получаю строку назад из Postgres, когда вы делаете '{}', и, таким образом, когда вы пытаетесь выполнить indifferent_access, это терпит неудачу, потому что строка не может иметь равнодушный доступ. Вероятно, это был мой первый хэдшоп, что было несколько проблем с информацией, которую они предоставляли.

Я честно не использовать прямо {} во всяком случае, в пользу [] над {}, потому что обычно я обработки очень конкретные функции ведения журнала я хочу четко на записи без необходимости соединения двух больших таблиц. Это мой пример использования здесь на 5.0, и это может быть немного иначе, если вы < 5, но, вероятно, не сильно.

Смежные вопросы