2015-11-04 43 views
1

我正在升級Rails 3項目到Rails 4,它打破了我的一個使用ActiveRecord Store屬性的模型。我的模型如下所示:在rails 4.2中的ActiveRecord商店屬性打破序列化

class ModelClass < ActiveRecord::Base 
    attr_accessible :attr_1, ..., attr_n, as: :admin 

    store :properties, accessors: [:attr_1, ..., :attr_n], coder: JSON 
end 

:properties場是Postgres的文本字段。

,當我嘗試訪問在這個模型中,我得到的數據可以JSON::ParserError

795: unexpected token at '{"attr_1"=>"", ..., "attr_n"=>""}' 

這些記錄是在Rails 3中所有創建的,之前升級到Rails 4我的模型類沒有coder: JSONstore呼叫的末尾。它看起來像數據庫中的數據沒有正確序列化,任何人都不知道爲什麼以及如何解決它?是否因爲我的數據看起來像數據庫中的=>散列火箭的紅寶石散列?

回答

1

是的,JSON解析器失敗,因爲該字符串不是JSON。

您可以通過評估字符串並將其轉換爲json來修復記錄。 eval是要小心使用,但如果這是一次性工作,那麼你可以在rails console中運行這樣的事情。

ModelClass.all.each do |m| 
    m.properties = eval(m.properties).to_json 
    m.save 
end 

未經測試,請在更新整個表格之前試一下記錄。

+0

它仍然會以文本形式存儲在數據庫中嗎?當我添加新記錄時,他們現在會以正確的json格式存儲嗎? – azrosen92

+0

它將被存儲爲文本是。如果你能夠在數據庫級別上使用json數據類型,那麼它會更好(你不需要'store'序列化,而是'store_accessor'來讀取數據) – jazzytomato

+0

我在猜測這是行不通的,因爲ModelClass會在每行加載時將'properties'解析爲JSON。我認爲你需要完全繞過模型,並使用直接數據庫調用手動進行格式轉換。 –

相關問題