2017-12-01 13 views
0

일련 화 된 텍스트 열이있는 모델이 있습니다. 레코드를 저장하고 다시로드하면 값이 지속되는 것처럼 보이지만 레코드를 쿼리하면 값이 사라집니다. 값으로 {"foo" => "bar"}을 저장할 때레일 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 

같은 일이 발생합니다.

나는 또한 save가 호출 될 때, 결과 SQL 쿼리는 다음과 같다 것으로 나타났습니다 :

UPDATE 'subscriptions' SET 'updated_at' = '2017-12-01 23:46:05', 'pending_changes' = '--- {}\n' WHERE 'subscriptions'.'id' = 2 

비슷한 질문에 대한 답변에 따라, 나는이 DB를 열 데이터 유형이 text 있는지 확인했습니다 및 나는 Hash을 덧붙인 것과 붙이지 않고 serialize :column_name을 사용해 보았습니다.

답변

5

데이터베이스에 열이 있으므로 attr_accessible : attending_changes 및 attr_accessor : pending_changes를 모델에서 제거하므로 attr_accessible, attr_accessor를 사용할 필요가 없습니다. 아래의 모델 코드를 사용하여 시도하십시오.

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

글쎄! 감사. 질량 할당 (내 경험)에 필요하기 때문에'attr_accessible'을 설정하는 습관이 생겼습니다. 나는이 경우없이 할 수 있습니다. 'attr_accessible'과 직렬화 된 데이터 충돌에 대해 잘 알고 있습니까? –