簡體   English   中英

新數據未持久到Postgres上的Rails數組列

[英]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當前不跟蹤“破壞性”或就地更改。 這些包括數組pushpopadvance 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM