2011-02-09 74 views
18

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

我已经试过......

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

,只是

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

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

回答

33

当Rails序列化一个哈希以保存在数据库中时,它所做的只是将其转换为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 
+0

after_initialize是一个很好的解决方案!谢谢! – brewster 2011-02-09 20:55:57

+3

非常了解迁移中的yaml技巧,谢谢! – opsb 2011-02-27 06:37:03

+0

好答案... – dastanko 2012-02-02 17:13:50

4

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

class MyModel < ActiveRecord::Base 

    def dimensions_in 
    attributes["dimensions_in"] ||= {:width => 0, :height => 0, :depth => 0} 
    end 

end 
7

您还可以指定序列化列的默认类。见the docs

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

我发现after_initialize块可能会导致巨大的性能击中,特别是如果你将永远需要MyModel.all(例如:对于批量出口)

没有等级:MyModel.new.dimensions_in => nil

有了一个默认的散列类:MyModel.new.dimensions_in => {}