Пустой массив по умолчанию для атрибута serial_record serialized

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

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

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

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

Ответ 1

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

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

Ответ 2

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

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

... может сделать трюк. Обе миграции, похоже, одинаково ведут себя в моем тестовом приложении.

Ответ 3

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

Migration:
t.text :tags

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

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

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