使用默认值和新对象的导轨序列化
问题描述:
还有另一个导轨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"
是否有可能得到这个工作没有任何这些?
after_initialize :method
- 像default_value_for
- 宝石覆盖
initialize
我真的想要得到它,只有数据库的默认工作。难道我做错了什么?
答
永远不要发现是什么导致这种行为失败,但一切都适用于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
什么数据库适配器您使用? – mdominiak 2012-07-17 23:07:51
我使用[this](https://github.com/dazuma/activerecord-postgis-adapter)one ..嗯..我会检查它是否发生没有它。 – 2012-07-18 01:23:50
我工作正常与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