2011-02-09 80 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 => {}