具体场景比如我希望做一个自签名的 CA,那么 CA Certificate 我希望可以序列化后保存在数据库里。然后每次取出这个 model 的时候就像拿出了一个 CA (OpenSSL::X509::Certificate.new raw_pem_string
),并且这个对象也继承了 OpenSSL::X509::Certificate
的所有方法
class CACertificate < ActiveRecord::Base
def initialize
@obj = OpenSSL::X509::Certificate.new self.raw
end
def subject # method from OpenSSL::X509::Certificate
@obj.subject
end
def save
@obj.to_pem
end
end
CACertificate.find(1).subject
我其实还有另一种需求,就是把一个 AR 里面的一个属性当作一个对象来处理,当然保存的时候再用序列化的方式保存,下次取出的时候反序列化即可,比如 IP
class Server < ActiveRecord::Base
def ip
@ip ||= IPAddress.new read_attribute(:ip) # 类似这样,但我不知道怎么序列化存进数据库
end
end
把 AR 的属性当作对象来处理解决了,有两个方案:
class Server < ActiveRecord::Base
def ip=(ip)
write_attribute(:ip, ip.to_s).tap { @ip = nil }
end
def ip
@ip ||= IPAddr.new read_attribute(:ip)
end
end
class Server < ActiveRecord::Base
serialize :ip, IPAddress
end