我有一个活跃的记录模型:
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来做到这一点,但我更喜欢在迁移中设置默认值
可以选择指定要将对象存储为的类。尝试这个:
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视为数组的[]。