Что делает .yaml с моим столбцом в приведенном ниже синтаксисе? - PullRequest
0 голосов
/ 04 мая 2018

В настоящее время я пытаюсь добавить столбец, содержащий массив строк, в одну из моих таблиц, например:

`add_column :videos, :thumbnails, :string, array: true, default: []`

Но вышеприведенное выдает ошибку: TypeError: can't quote Array.

Я изучал способы решения этой проблемы, и я столкнулся с этим:

add_column :videos, :thumbnails, :string, array: true, default: [].to_yaml`

Что .yaml делает с моей колонкой? И есть ли другой способ пойти по этому поводу? Кстати, я использую Rails 5.

Ответы [ 2 ]

0 голосов
/ 04 мая 2018

Вы правильно определяете столбец собственного типа массива Postgres, но установка default: [] - полная ерунда, так как по умолчанию для столбца массива в любом случае является пустой массив.

add_column :videos, :thumbnails, :string, array: true

Правильный синтаксис для вставки значений в массив Postgres на самом деле больше похож на объявление структур в C:

{ "foo", "bar", "baz" }

Так что правильный способ установить значение по умолчанию, если оно вам действительно нужно, это

add_column :videos, :thumbnails, :string, array: true, default: '{ "foo" }'

Примеры, с которыми вы сталкивались:

default: [].to_yaml

Будет допустимо, если вы используете обычный столбец varchar для хранения данных YAML с помощью Rails serializion методов, которые являются плохой заменой для собственных типов столбцов JSON и массивов базы данных. Не путайте это с нативными типами.

0 голосов
/ 04 мая 2018

Вы пытаетесь сериализовать объект ruby ​​(Array) в столбец строки базы данных.

Чтобы сделать это возможным, вам нужно вызвать to_yaml, который преобразует массив в формат yaml String. Другого пути нет, но вы должны это сделать.

1] pry(main)> ['https://www.youtube.com/watch?v=MQU1tFkpMag', 'https://www.youtube.com/watch?v=dYa_Z2pYzcU'].to_yaml => "---\n- https://www.youtube.com/watch?v=MQU1tFkpMag\n- https://www.youtube.com/watch?v=dYa_Z2pYzcU\n" 2] pry(main)> [].to_yaml => "--- []\n"

Когда вы прочитаете этот столбец, он будет десериализован в объект ruby, и вы получите массив ruby.

Стоит прочитать https://www.viget.com/articles/how-i-used-activerecord-serialize-with-a-custom-data-type/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...