activerecord迁移中序列化列的默认值

所以我有一个序列化列:维度,在我的迁移中,我想将字段设置为默认哈希。

我试过了…

create_table :shipping_profiles do |t| t.string :dimensions_in, :default => {:width => 0, :height => 0, :depth => 0} 

只是

 t.string :dimensions_in, :default => Hash.new() 

但是这些字段最终为空。 如何在创建时为此字段设置默认的序列化对象,或者至少确保我的serialize属性始终是哈希?

当Rails序列化一个散列以保存在db中时,它所做的就是将它转换为YAML,以便它可以存储为字符串。 要使其在迁移中起作用,您需要做的就是将哈希转换为yaml …

 t.string :dimensions_in, :default => {:width => 0, :height => 0, :depth => 0}.to_yaml 

或者,也可以在初始化后将其设置在模型中…

 class ShippingProfile < ActiveRecord::Base after_initialize :set_default_dimensions private def set_default_dimensions self.dimensions_in ||= {:width => 0, :height => 0, :depth => 0} end end 

您还可以为序列化列指定默认类。 查看文档 。

 class MyModel < ActiveRecord::Base serialize :dimensions_in, Hash end 

我发现after_initialize块会导致巨大的性能 损失 ,特别是如果你需要MyModel.all (例如:用于批量导出)

没有类: MyModel.new.dimensions_in => nil

使用默认的Hash类: MyModel.new.dimensions_in => {}

我尝试了这段代码,它对我有用。 这利用了ActiveRecord动态发送同步到表列的模型方法的方式。

 class MyModel < ActiveRecord::Base def dimensions_in attributes["dimensions_in"] ||= {:width => 0, :height => 0, :depth => 0} end end