所以我有一个序列化列:维度,在我的迁移中,我想将该字段设置为默认哈希。
我试过......
create_table :shipping_profiles do |t|
t.string :dimensions_in, :default => {:width => 0, :height => 0, :depth => 0}
只是
t.string :dimensions_in, :default => Hash.new()
但字段最终为null。如何在创建时为该字段设置默认的序列化对象,或者至少确保我的serialize属性始终是哈希值?
答案 0 :(得分:34)
当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
答案 1 :(得分:8)
您还可以为序列化列指定默认类。请参阅the docs。
class MyModel < ActiveRecord::Base
serialize :dimensions_in, Hash
end
我发现 after_initialize 块会导致巨大的性能损失,特别是如果您需要MyModel.all
(例如:用于批量导出) )
没有班级:MyModel.new.dimensions_in => nil
使用默认的哈希类:MyModel.new.dimensions_in => {}
答案 2 :(得分:4)
我尝试了这段代码,它对我有用。这利用了ActiveRecord动态发送同步到表列的模型方法的方式。
class MyModel < ActiveRecord::Base
def dimensions_in
attributes["dimensions_in"] ||= {:width => 0, :height => 0, :depth => 0}
end
end