4

又一个 Rails序列化问题。我已经阅读了很多这些并且找不到我的问题的答案,所以这里是:

我有典型的:

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

在我的迁移中(感谢这个问题+答案):

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

现在,当我加载现有用户时:prefs 被反序列化:

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"

如果没有这些,是否有可能让它工作?

我真的想让它只使用数据库默认值。难道我做错了什么?

4

2 回答 2

1

当我在 Rails 控制台(Rails 3.2.6,Ruby 1.9.3-p194)中执行以下操作时:

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

我回来了:

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

所以我认为这是你想要的语法。

于 2012-07-17T23:39:53.810 回答
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
于 2013-04-24T02:14:33.793 回答