2014-01-07 29 views
1

我有一個Impression模型,其actions屬性被序列化爲Array帶有數組插入的更新屬性

class Impression < ActiveRecord::Base 
    serialize :actions, Array 
end 

普通屬性更新程序:
impression.update(some_attr: "new_value")

普通陣列插入過程:
impression.actions << "new_value"
impression.save

是否有插入一個新的價值的作品就像一個數組屬性的方法.update方法,即在一個單一的表達式?

+1

我已經把'的Ruby-on-Rails的4'標籤,因爲'.update'語法是早期版本的(我認爲)不同。 –

+1

我已經恢復了標籤取消。 Rails 4中的'update'與之前的'update_attributes'一樣,但我同意這些標籤在這裏是有意義的。對不起,這個改變。 –

回答

1

不,使用ActiveRecord序列化功能時,這是不可能的,因爲序列化/反序列化必須由ActiveRecord控制器,並且update對數據庫執行直接SQL更新調用。

一些非關係數據庫(如MongoDB)提供此功能,因爲它們是爲了這樣做而設計的。 PostgreSQL提供了一個可以安裝的Hash擴展,它允許您在序列化字段上執行直接操作。

在所有其他情況下,您可能會直接更新該字段,但我不鼓勵您這樣做。編寫損壞的數據有潛在的風險。

相反,我建議您創建一個自定義方法,執行推送和保存。無論如何,這是一個好主意,因爲你在模型外部公開了一個定製API,而不是將你的模型耦合到ActiveRecord體系結構。

class Impression < ActiveRecord::Base 
    serialize :actions, Array 

    def add_action(action) 
    self.actions << action 
    self.save 
    end 
end 

的,你可以使用

impression = ... 
impression.add_action "new_value"