4

還有另一個導軌serialization的問題。我讀過不少,這些並不能找到答案,我的問題,所以在這裏它是:使用默認值和新對象的導軌序列化

我有典型的:

class User < ActiveRecord::Base 
    serialize :prefs, Hash 

在我的遷移(感謝this問題+答案):

add_column :user, :prefs, :text, default: { foo: 'bar' }.to_yaml 

現在,當我加載現有用戶:首選項被反序列:

User.first.prefs[:foo] # returns 'bar' 
User.first.prefs.class # returns Hash 
User.first.prefs  # returns {:foo => "bar"} 

所以它是完美的!但是,當我創建一個新的:

User.new.prefs[:foor] # TypeError: can't convert Symbol into Integer 
User.new.prefs.class # returns String 
User.new.prefs   # returns "---\n:foo: bar\n" 

是否有可能得到這個工作沒有任何這些?

我真的想要得到它,只有數據庫的默認工作。難道我做錯了什麼?

+1

什麼數據庫適配器您使用? – mdominiak 2012-07-17 23:07:51

+0

我使用[this](https://github.com/dazuma/activerecord-postgis-adapter)one ..嗯..我會檢查它是否發生沒有它。 – 2012-07-18 01:23:50

+0

我工作正常與pg(0.14.0)和activerecord-postgis適配器(0.4.3)適配器對我來說。但是,它不適用於sqlite3(1.3.6)適配器。這就是爲什麼我要求使用adapater的原因,因爲它可能需要對它做些什麼或它的版本。在sqlite3的情況下,如果列缺省值包含換行符(\ n),我認爲在解析列缺省時存在缺陷。我正在檢查最新的紅寶石(1.9.2-p194)+導軌(3.2.6)堆棧。 – mdominiak 2012-07-18 07:31:35

回答

1

永遠不要發現是什麼導致這種行爲失敗,但一切都適用於Rails 3.2.13。使用serialize :prefs, Hash

[1] pry(main)> User.new 
=> #<User id: nil, prefs: {:foo=>"bar"}, created_at: nil, updated_at: nil> 
[2] pry(main)> User.new.prefs 
=> {:foo=>"bar"} 

而且使用store :prefs, accessors: [:foo]

[1] pry(main)> User.new 
=> #<User id: nil, prefs: {:foo=>"bar"}, created_at: nil, updated_at: nil> 
[2] pry(main)> User.new.foo 
=> "bar" 

我的遷移是:

add_column :user, :prefs, :text, default: { foo: 'bar' }.to_yaml 
1

當我做在Rails的控制檯以下(Rails的3.2.6,1.9.3的Ruby-P194):

u=User.new(:prefs=>{:foo2=>"bar2"}) 

我回來:

=> #<User id: nil, name: nil, prefs: {:foo2=>"bar2"}, created_at: nil, updated_at: nil> 

所以我覺得這是你想要的語法。

+0

是的,這有效,但我不想在創建新用戶時設置默認值。我想要數據庫模式中的默認值。 – 2012-07-18 01:52:28