1

如何將數據列中的整數(用戶標識範圍從1到9999)序列化並檢索回來?新手:將序列化整數追加到數據庫列中並將其檢索回

在我的用戶模型我有邀請列,

User model 
serialize: invites 
invites = text field 

現在,我試圖做兩件事情:

  • 追加USER_ID整數(從1到9999)在一列連載「邀請」
  • 檢索來自User.invited列中的所有用戶ID的背部(反序列化?)
+2

Dont do that_永遠不要將多個數據存儲到一個字段中,如果你想單獨訪問它們 – 2012-02-28 16:33:24

+0

任何有關如何做到這一點或以其他方式進行訪問的建議或完全不可行?思想序列化也可以用於整數 – Rubytastic 2012-02-28 18:05:27

+1

創建邀請表,邀請者ID和被邀請者ID,每個邀請是一行,鏈接到兩個參與者。 – 2012-02-28 18:30:57

回答

2

fine manual

的serialize(attr_name,CLASS_NAME =對象)

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

所以,如果你想存儲整數數組作爲一個序列化對象,則:

class User < ActiveRecord::Base 
    serialize :invites, Array 
    #... 
end 

你想要的invites列在數據庫中(不string一個text列! )以避免遇到尺寸問題。

然後你可以把user.invites作爲一個普通數組:

user.invites = [ 1, 2, 3 ] 
user.invites.push(11) 

那當然不會驗證該號碼是有效的,或者你沒有重複(但你可以使用一個Set代替一個數組),它也不會阻止你在那裏放置一個字符串。

雖然我不建議你這樣做,但是序列化幾乎總是一個錯誤,它會在以後回來咬你。就數據庫而言,序列化列是一個不透明的數據blob:您無法就地更新它,您無法查詢它,只能將其從數據庫中取出並放回原處。 serialize使用YAML進行序列化,如果您需要使用數據庫中的序列化數據,那麼這是一種糟糕的格式;您也可以在升級期間遇到interesting encoding issues

你最好設置一個傳統關聯表和一個單獨的模型(可能使用has_many ... :through =>)來處理這種情況。

+0

好吧,我現在看到我在這個錯誤的道路上,現在我明白我應該更好地使用has_many通過它也將更容易顯示在視圖中的數據,thx爲了明確 – Rubytastic 2012-02-28 18:42:29

相關問題