在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
。
答案 0 :(得分:0)
这很奇怪,因为YAMLColumn多年来一直表现得像这样。看看this commit。
答案 1 :(得分:0)
我不确定4.1.10和4.2.1之间的哪个提交引入了这种行为,但它的不是错误,因为它有详细记录here。特别是,
如果指定了class_name,则序列化对象必须在赋值和检索时属于该类。否则将引发SerializationTypeMismatch。