我有一个活跃的记录模型:
class Person < ActiveRecord::Base
serialize :tags, Array
end
并且在迁移中,tags列被声明为
t.text :tags, :default => []
但是当我尝试创建一个人时
Person.new
我收到错误
ActiveRecord::SerializationTypeMismatch: added was supposed to be a Array, but was a String
如何在迁移中将默认设置为空数组?
注意:我知道我可以使用after_initialize来执行此操作,但我更喜欢在迁移中设置默认值
答案 0 :(得分:8)
可以选择指定要将对象存储为的类。试试这个:
class Person < ActiveRecord::Base
serialize :tags, Array
end
答案 1 :(得分:3)
这听起来有点像你遇到了一个框架错误或其他东西干扰了你的迁移;我刚刚尝试使用Rails 2.3.10构建上述内容,并且可以毫无问题地实例化对象。但是,我注意到YAML用于序列化,所以:
t.text :tags, :default => [].to_yaml
......可能会成功。在我的测试应用程序中,两次迁移似乎都表现得相同。
答案 2 :(得分:2)
我遇到了类似的问题,并通过删除默认值解决了这个问题。 当您开始向数组添加值时,ActiveRecord会将nil视为[]。
Migration:
t.text :tags
Model:
class Person < ActiveRecord::Base
serialize :tags, Array
end
Usage:
p = Person.new
p.tags << "test"
这是有效的,因为Rails会将nil视为数组的[]。