[英]New data not persisting to Rails array column on Postgres
我有一個帶有text類型的friends列的用戶模型。 運行此遷移是為了將數組功能與postgres結合使用:
add_column :users, :friends, :text, array: true
用戶模型具有以下方法:
def add_friend(target)
#target would be a value like "1234"
self.friends = [] if self.friends == nil
update_attributes friends: self.friends.push(target)
end
通過以下規范,直到我在調用#add_friend
之后添加user.reload
#add_friend
:
it "adds a friend to the list of friends" do
user = create(:user, friends: ["123","456"])
stranger = create(:user, uid: "789")
user.add_friend(stranger.uid)
user.reload #turns the spec red
user.friends.should include("789")
user.friends.should include("123")
end
這也在開發中發生。 模型實例已更新,並且在數組中具有新的uid,但是一旦重新加載或以其他操作重新加載用戶,它就會恢復為調用add_friend
方法之前的add_friend
。
使用Rails 4.0.0.rc2和pg 0.15.1
這可能是什么?
我懷疑ActiveRecord不會注意到您的friends
數組已更改,因為,當您執行以下操作時,基礎數組引用不會更改:
self.friends.push(target)
這將改變數組的內容 ,但數組本身仍將是同一數組。 我知道這個問題出現在Rails3中的postgres_ext gem並給出了這個問題 :
字符串屬性用
<<
更改時,未標記為臟
我希望Rails4的行為相同。
解決方案是創建一個新數組,而不是嘗試就地修改該數組:
update_attributes friends: self.friends + [ target ]
有多種方法可在將元素添加到現有數組時創建新數組,無論您喜歡哪種方法。
看來問題可能出在您使用push
修改了數組的位置。
我找不到更主要的自動取款機,但是這篇文章說:
與模型上的數組(或其他可變值)交互時要注意的一件事。 ActiveRecord當前不跟蹤“破壞性”或就地更改。 這些包括數組
push
和pop
,advance
DateTime對象。 如果要使用“破壞性”更新,則必須調用<attribute>_will_change!
讓ActiveRecord知道您更改了該值。
如果要使用Postgresql數組類型,則必須遵守其格式。 從Postgresql文檔輸入的格式是
'{10000, 10000, 10000, 10000}'
不是friends.to_s
返回的內容。 在紅寶石中:
[1,2,3].to_s => "[1,2,3]"
也就是說,用括號代替大括號。 您必須自己進行轉換。
但是,我寧願依賴ActiveRecord進行序列化(請參閱序列化 )。 數據庫不需要知道該值實際上是一個數組,這就是您的域模型泄漏到數據庫中。 讓Rails做事並封裝這些信息。 它已經知道如何對值進行序列化/反序列化。
注意:此響應僅適用於Rails 3,而不適用於Rails4。我將留在這里,以防將來對某人有所幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.