Ответ 1
Существует возможность указать класс, который вы хотите хранить как объект. Попробуйте следующее:
class Person < ActiveRecord::Base
serialize :tags, Array
end
У меня есть активная модель записи:
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, но я предпочитаю устанавливать значения по умолчанию при миграции
Существует возможность указать класс, который вы хотите хранить как объект. Попробуйте следующее:
class Person < ActiveRecord::Base
serialize :tags, Array
end
Звучит так, как будто вы попали в фреймворк, или что-то еще мешает вашей миграции; Я просто попытался построить выше с помощью Rails 2.3.10 и может создавать объекты без проблем. Однако я отмечаю, что YAML используется для сериализации, поэтому:
t.text :tags, :default => [].to_yaml
... может сделать трюк. Обе миграции, похоже, одинаково ведут себя в моем тестовом приложении.
У меня была аналогичная проблема, и я решил ее удалить из значения по умолчанию. ActiveRecord будет обрабатывать nil как [], когда вы начнете добавлять значения в массив.
Migration:
t.text :tags
Model:
class Person < ActiveRecord::Base
serialize :tags, Array
end
Usage:
p = Person.new
p.tags << "test"
Это работает, потому что Rails будет обрабатывать nil как [] для массива.