Пустой массив по умолчанию для сериализованного атрибута active_record - PullRequest
11 голосов
/ 27 февраля 2011

У меня есть модель активной записи:

class Person < ActiveRecord::Base
  serialize :tags, Array
end

, и в миграции столбец тегов объявляется как

t.text :tags, :default => []

, но когда я пытаюсь создать человека

Person.new

Я получаю ошибку

ActiveRecord::SerializationTypeMismatch: added was supposed to be a Array, but was a String

Как установить по умолчанию пустой массив в процессе миграции?

Примечание: я знаю, что могу сделать это с помощью after_initialize, ноЯ предпочитаю устанавливать значения по умолчанию при миграции

Ответы [ 3 ]

8 голосов
/ 27 февраля 2011

Существует возможность указать класс, в котором вы хотите хранить объекты. Попробуйте это:

class Person < ActiveRecord::Base
  serialize :tags, Array
end
3 голосов
/ 27 февраля 2011

Звучит так, будто вы столкнулись с ошибкой фреймворка или что-то еще мешает вашей миграции;Я только что попытался собрать вышеизложенное с помощью Rails 2.3.10 и могу создавать объекты без проблем.Однако я отмечаю, что YAML используется для сериализации, поэтому:

t.text :tags, :default => [].to_yaml

... может помочь.Обе миграции в моем тестовом приложении работали одинаково.

2 голосов
/ 23 января 2017

У меня была похожая проблема, и я решил ее, удалив значение по умолчанию.ActiveRecord будет обрабатывать nil как [], когда вы начнете добавлять значения в массив.

Migration:
t.text :tags

Model:
class Person < ActiveRecord::Base
  serialize :tags, Array
end

Usage:
p = Person.new
p.tags << "test" 

Это работает, потому что Rails будет обрабатывать nil как [] для массива.

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