2017-12-01 14 views
0

シリアル化されたテキスト列を持つモデルがあります。レコードを保存してリロードすると、値は保持されているように見えますが、レコードを照会すると値はなくなります。Rails 3シリアル化されたハッシュ値は保存されますが、永続化されません。

(簡単にするために切り詰められた、以下のデモンストレーション)

class Subscription < ActiveRecord::Base 
    serialize :pending_changes, Hash 
    attr_accessible :pending_changes 
    attr_accessor :pending_changes 
end 

class AddPendingChangesToSubscriptions < ActiveRecord::Migration 
    def change 
    add_column :subscriptions, :pending_changes, :text 
    end 
end 

s = Subscription.new 

s.pending_changes = {foo: "bar"} 

s.save 
# => true 

s.reload.pending_changes 
# => {foo: "bar"} 

Subscription.last.pending_changes 
# => nil 

値として{"foo" => "bar"}を保存するときに同じことが起こります。

私もsaveが呼び出されたときに、次のように、結果のSQLクエリがあることに気付きました:

同様の質問を1として
UPDATE 'subscriptions' SET 'updated_at' = '2017-12-01 23:46:05', 'pending_changes' = '--- {}\n' WHERE 'subscriptions'.'id' = 2 

、私は、DBの列のデータ型がtextであることを確認して行ったと私は、を付加したものと加えなかったものを用いて試してみた。Hash

答えて

5

データベースにカラムがあるので、attr_accessible:attending_changesとattr_accessor:pending_changesをモデルから削除します。したがって、attr_accessible、a​​ttr_accessorを使用する必要はありません。以下のようにモデルコードを使用して試してください。

class Subscription < ActiveRecord::Base 
    serialize :pending_changes, Hash 
end 
+0

よくトリックを行いました。ありがとう。私は 'attr_accessible'を設定する習慣を覚えました。私の経験上、大量割り当てに必要なのでです。この場合、私はそれなしですることができます。 'attr_accessible'とシリアル化されたデータの競合について知っていますか? –

関連する問題