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


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

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来做到这一点,但我更喜欢在迁移中设置默认值


12034
2018-02-27 15:29


起源

而不是after_initialize,请尝试使用default_value_for插件: github.com/FooBarWidget/default_value_for - Paul Schreiber
请注意,您无法在MySQL中的TEXT列上设置默认值,也可能在其他列中设置默认值。 - coreyward
coreyward:有趣,我不知道。看起来它只是Windows上的一个问题 bugs.mysql.com/bug.php?id=25520 - opsb
paul:default_value_for插件看起来很整洁,如果我找不到迁移的方法,那么我想我会走那条路 - opsb
我也是同样的问题 string 我序列化为的列 Array。空数组将导致空字符串 ""。问题是专栏有 null: false 和 serialize 想要序列化 [] 如 nil。当它不能,它使用 "",但它无法正确反序列化。 - nitsas


答案:


可以选择指定要将对象存储为的类。尝试这个:

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

8
2018-02-27 16:37



啊,好抓,应该是原来的帖子。我已经有了这个指定,没有骰子。 - opsb


这听起来有点像你遇到了一个框架错误或其他东西正在干扰你的迁移;我刚刚尝试使用Rails 2.3.10构建上述内容,并且可以毫无问题地实例化对象。但是,我注意到YAML用于序列化,因此:

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

......可能会有所作为。在我的测试应用程序中,两次迁移似乎都表现得相同。


3
2018-02-27 16:24



是的,我给了那一个,它在模式中变成了“”而不是“--- [] \ n \ n” - opsb
由于我无法在Rails 2.3上复制此错误,因此它可能是Rails 3问题,也可能是应用程序更广泛的问题。为了防止其他地方关于文本列的评论出现在标记上,您是否尝试使用“t.string”而不是“t.text”,所有其他代码都是最初编写的,就像实验一样?哦,你试过吗? 无 'serialize'调用中的“Array”类说明符? - Andrew Hodgkinson


我有一个类似的问题,并通过删除默认值解决它。 当您开始向数组添加值时,ActiveRecord会将nil视为[]。

Migration:
t.text :tags

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

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

这是有效的,因为Rails会将nil视为数组的[]。


2
2018-01-23 13:44



像梦一样工作 - nfriend21