4

さらに別のレールシリアライゼーションの質問。私はこれらの多くを読みましたが、私の問題に対する答えを見つけることができなかったので、ここにあります:

私は典型的なものを持っています:

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"

これらなしでこれを機能させることは可能ですか?

  • after_initialize :method
  • default_value_forのような宝石
  • オーバーライドinitialize

データベースのデフォルトのみで動作させたいと本当に思っています。私は何か間違ったことをしていますか?

4

2 に答える 2

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 に答える
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 に答える