【问题标题】:Empty array as default for active_record serialized attribute空数组作为 active_record 序列化属性的默认值
【发布时间】:2011-07-05 06:40:32
【问题描述】:

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

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

迁移中如何设置默认为空数组?

注意:我知道我可以使用 after_initialize 来做到这一点,但我更喜欢在迁移中设置默认值

【问题讨论】:

  • 代替 after_initialize,试试 default_value_for 插件:github.com/FooBarWidget/default_value_for
  • 请注意,您不能在 MySQL 中的 TEXT 列上设置默认值,可能还有其他列。
  • coreyward:有趣,我不知道。看起来这只是 Windows 上的问题bugs.mysql.com/bug.php?id=25520
  • paul:default_value_for 插件看起来很整洁,如果我找不到迁移的方法,那么我想我会走这条路
  • 我在序列化为Arraystring 列上遇到了同样的问题。一个空数组将产生一个空字符串""。问题是该列有null: falseserialize 想要将[] 序列化为nil。当它不能时,它使用"",但是它不能正确反序列化。

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


【解决方案1】:

有一个选项可以指定要将对象存储为的类。试试这个:

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

【讨论】:

  • 啊,很好,应该在原始帖子中。我已经指定了这个,没有骰子。
【解决方案2】:

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

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

...也许可以解决问题。在我的测试应用程序中,这两种迁移似乎表现相同。

【讨论】:

  • 是的,我试了一下,它在架构中变成了 "" 而不是 "--- []\n\n"
  • 由于我无法在 Rails 2.3 上复制此错误,因此它要么是 Rails 3 问题,要么是您的应用程序更广泛的问题。但是,以防万一其他地方有关文本列的 cmets 出现在标记上,您是否尝试过使用“t.string”而不是“t.text”,以及最初编写的所有其他代码,只是作为一个实验?哦,您是否尝试过在“serialize”调用中不使用“Array”类说明符?
【解决方案3】:

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

Migration:
t.text :tags

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-29
    • 1970-01-01
    • 2011-03-25
    • 2017-01-31
    • 2011-03-22
    • 1970-01-01
    • 1970-01-01
    • 2014-09-28
    相关资源
    最近更新 更多