使用默认值和新对象的导轨序列化

问题描述:

还有另一个导轨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

永远不要发现是什么导致这种行为失败,但一切都适用于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 

当我做在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