空数组作为active_record序列化属性的默认值

时间:2011-02-27 15:29:28

标签: ruby-on-rails ruby-on-rails-3 serialization activerecord attributes

我有一个活跃的记录模型:

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来执行此操作,但我更喜欢在迁移中设置默认值

3 个答案:

答案 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视为数组的[]。