0

我有我的模型上的數組和設置,並且當我將數組寫入到我的記錄時,它表示COMMIT爲true,但在檢查該記錄後立即檢查字段返回一個空數組。Rails無法寫入到數據庫中的序列化數組字段

型號:

class Feature < ActiveRecord::Base 
    serialize :content, Array 
    attr_accessible :content 
end 

遷移:

class AddContentToFeatures < ActiveRecord::Migration 
    def change 
    add_column :features, :content, :text, array: true, default: [] 
    end 
end 

我試了一下,用各種符號和字符串語法一起,是這樣的:

> f=Feature.new 
> f.content_will_change! #i feel like i shouldn't have to do this 
> f.content = ['sadasd','asdasd'] 
> f.save! 
    BEGIN 
    COMMIT 
=> true 
> f.content 
=> [] 

如何堅持數組在模型上?

+1

我一直序列化數組沒有問題,但數據庫只是假定一個文本字段,只不過是。我會'rake db:rollback',然後刪除'array:true,default:[]',然後再次遷移。 @peterkim的建議對我來說很有意義。 – SteveTurczyn

+0

@SteveTurczyn但PostgreSQL理解SQL數組,所以在PostgreSQL中使用'serialize' kludge有點討厭。 –

+0

對不起,我忽略了'postgresql'標記。要麼答案有效,但@muistooshort的答案是最好的答案。 – SteveTurczyn

回答

4

如果您在使用本機PostgreSQL的數組(你是因爲你在你的遷移有array: true),那麼你根本不應該使用serializeserialize用於存儲YAML在數據庫中:

連載(attr_name,class_name_or_coder =對象)

如果有需要被保存到數據庫中作爲對象,並且作爲檢索的屬性相同的對象,然後使用此方法指定該屬性的名稱,它將自動處理。序列化通過YAML完成。如果指定了class_name,則序列化對象必須在分配和檢索時具有該類。否則SerializationTypeMismatch將會籌集。

因此serialize只是在數據庫中的text列內存儲YAML編碼的對象。但是PostgreSQL,Rails4中的ActiveRecord以及底層的PostgreSQL驅動都可以理解沒有YAML不愉快的數組。

在您的遷移中保留array: true,從模型中刪除serialize :content, Array,它應該可以正常工作。作爲額外的獎勵,您將可以使用所有的PostgreSQL's array operators and functions來查詢您的contentserialize不允許您這樣做。

1

Rails序列化程序的默認數據結構是一個哈希,您不保存到f.content

要保存一個數組的序列化的內容,嘗試在特徵模型如下:

serialize :content, Array 
+0

嗨。我已經用這裏指定的數組來完成它了。我只是刪除它,因爲它似乎沒有做任何事情。無論是否指定Array,我都會得到相同的結果。添加到問題壽。 – volx757

+1

您可能想嘗試更新不含'array:true,default:[]' –

+0

yes的遷移,就是這樣,謝謝。我想知道爲什麼這是在軌道文檔...我將這標記爲答案。 – volx757

相關問題