Ruby on rails 我可以在ActiveRecord中序列化什么对象?
我很高兴地使用Ruby on rails 我可以在ActiveRecord中序列化什么对象?,ruby-on-rails,ruby,activerecord,serialization,Ruby On Rails,Ruby,Activerecord,Serialization,我很高兴地使用serialize:my_array,array和serialize:my_hash,hash在数据库中方便地存储设置和数组 我可以用这种方式使用哪些其他对象?例如,我知道我可以使用Struct和OpenStruct,但是我怎么知道一个对象是否可以用ActiveRecord以这种方式序列化呢?例如,我如何知道我是否可以这样使用类Set(请注意,它应该被称为UniqArray)呢?此代码在Rails的serialize方法中确定序列化的编码器: if [:load, :dump].
serialize:my_array,array
和serialize:my_hash,hash
在数据库中方便地存储设置和数组
我可以用这种方式使用哪些其他对象?例如,我知道我可以使用
Struct
和OpenStruct
,但是我怎么知道一个对象是否可以用ActiveRecord以这种方式序列化呢?例如,我如何知道我是否可以这样使用类Set
(请注意,它应该被称为UniqArray
)呢?此代码在Rails的serialize
方法中确定序列化的编码器:
if [:load, :dump].all? { |x| class_name.respond_to?(x) }
class_name
else
Coders::YAMLColumn.new(class_name)
end
简而言之,这意味着:如果对象本身具有load
和dump
方法,则可以序列化对象。或者如果YAML
可以加载和转储对象
。这样检查:
object == YAML.load(YAML.dump(object)) # with require 'yaml' in irb
此代码确定Rails
serialize
方法中序列化的编码器:
if [:load, :dump].all? { |x| class_name.respond_to?(x) }
class_name
else
Coders::YAMLColumn.new(class_name)
end
简而言之,这意味着:如果对象本身具有load
和dump
方法,则可以序列化对象。或者如果YAML
可以加载和转储对象
。这样检查:
object == YAML.load(YAML.dump(object)) # with require 'yaml' in irb
AR中的序列化使用Psych将实例转储到yaml字符串中
Psych知道如何序列化从Object继承的所有对象(Ruby中几乎所有的对象)
在一般情况下,Psych将对象的所有实例变量作为yaml字段转储
转储几个类也有一些特殊情况,例如数组
,类
,日期
,日期时间
,异常
,假类
,浮点
,整数
,模块
,零类
,范围
,理性
,Regexp
,String
,Struct
,Symbol
,Time
,TrueClass
,以及其他一些很少使用的
例如,如果我们有类UniqArray
,实例UniqArray.new([1,2,3])
,转储字符串将是“--!ruby/object:UniqArray\nhash:\n1:true\n2:true\n3:true\n”
(其中哈希
是实现Set存储的实例变量名)AR中的序列化使用Psych将实例转储到yaml字符串中
Psych知道如何序列化从Object继承的所有对象(Ruby中几乎所有的对象)
在一般情况下,Psych将对象的所有实例变量作为yaml字段转储
转储几个类也有一些特殊情况,例如数组
,类
,日期
,日期时间
,异常
,假类
,浮点
,整数
,模块
,零类
,范围
,理性
,Regexp
,String
,Struct
,Symbol
,Time
,TrueClass
,以及其他一些很少使用的
例如,如果我们有类UniqArray
,实例UniqArray.new([1,2,3])
,转储字符串将是“--!ruby/object:UniqArray\nhash:\n1:true\n2:true\n3:true\n”
(其中哈希
是实现Set存储的实例变量名)