ruby的serialize序列化与属性分解

阅读更多
      序列化(Serialize)通常指的是將一個物件轉換成一個可被資料庫儲存及傳輸的純文字形態,反之將這筆資料從資料庫讀出後轉回物件的動作我們就稱之為反序列(Deserialize),Rails提供了serialize讓你指定需要序列化資料的欄位,任何物件在存入資料庫時就會自動序列化成YAML格式,而當從資料庫取出時就會自動幫你反序列成原先的物件。下面的範例中,settings通常是text型態讓我們有更大的空間可以儲存資料,然後我們將一個Hash物件序列化之後儲存到settings裡:
class User < ActiveRecord::Base
  serialize :settings
end

> user = User.create(:settings => { "sex" => "male", "url" => "foo" })
> User.find(user.id).settings # => { "sex" => "male", "url" => "foo" }

雖然序列化很方便可以讓你儲存任意的物件,但是缺點是序列化資料就失去了透過資料庫查詢索引的功效,你無法在SQL的where條件中指定序列化後的資料。

序列化将两个类属性指向一个记录字段的用法:
class Media
  serialize :regions, Hash

  def other_countries
    (self.regions = {}) if self.regions.blank?
    self.regions["other_countries"] || []
  end

  def other_countries=(value)
    (self.regions = {}) if self.regions.blank?
    self.regions["other_countries"] = value
  end

  def other_cities
    (self.regions = {}) if self.regions.blank?
    self.regions["other_cities"] || []
  end

  def other_cities=(value)
    (self.regions = {}) if self.regions.blank?
    self.regions["other_cities"] = value
  end
 
end


代码生成country和city属性,序列化hash格式存储到regions字段中

你可能感兴趣的:(ruby)