ActiveRecord不会将字符串中的数组转换为数组

时间:2015-04-08 11:38:21

标签: ruby-on-rails ruby-on-rails-4.2

在Rails 4.2.0 之前,ActiveRecord会自动将String转换为serialize指定的类型。

class Post < ActiveRecord::Base
  serialize :options, Array # Column type: 'text', DB: PostgreSQL
end

class PostTest < ActiveSupport::TestCase
  test "assign options" do
    post = Post.new
    post.options = "[1,2,3]" # => "[1,2,3]"
  end
end

在Rails 4.2.1

class Post < ActiveRecord::Base
  serialize :options, Array
end

class PostTest < ActiveSupport::TestCase
  test "assign options" do
    post = Post.new
    post.options = "[1,2,3]" # ActiveRecord::SerializationTypeMismatch: Attribute was supposed to be a Array, but was a String.
  end
end

我无法在文档中找到这个,更改日志。是否删除了这种类型的String to Array转换或者它是一个错误?在我的用例中,我有一个从params分配给模型的String。它适用于Rails 4.1.10,但在Rails 4.2.1中,它引发了ActiveRecord::SerializationTypeMismatch

2 个答案:

答案 0 :(得分:0)

这很奇怪,因为YAMLColumn多年来一直表现得像这样。看看this commit

答案 1 :(得分:0)

我不确定4.1.10和4.2.1之间的哪个提交引入了这种行为,但它的不是错误,因为它有详细记录here。特别是,

  

如果指定了class_name,则序列化对象必须在赋值和检索时属于该类。否则将引发SerializationTypeMismatch。