开发者

Serialization to blob in rails 3

开发者 https://www.devze.com 2023-01-26 21:27 出处:网络
I have an rails app where one of the attributes on an object is a data set which consists of an array of x,y coordinates. I am currently storring this in the sql database using the rails serialize hel

I have an rails app where one of the attributes on an object is a data set which consists of an array of x,y coordinates. I am currently storring this in the sql database using the rails serialize helper :

serialize :data, A开发者_Go百科rray

This converts the array to yaml and then stores it in a string field in the sql database. The problem is that our database is getting really big doing this and we need to keep it smaller. Is it possible to serialize to raw binary instead of a string and store in a blob?, this would dramatically reduce the size and help our problem.

I have had a search for a gem to do this, or even a ruby method that will turn an array in to binary data without much help. Any suggestions would be appreciated.


You may be interested in Array.pack and String.unpack methods. See ruby documentation for it: type ri Array.pack

You may want to use a 'packed_data' attribute in your database, then add accessors to pack/unpack it:

def data
  packed_data.unpack('....')
end
def data=(v)
  self.packed_data = v.pack('....')
end

To make it more useful, you may store the unpacked form in a variable, but you have to remember to clear it when the packed_data attribute changes, like when you call .reload

before_validation :pack_data

UNPACK_FORMAT = '.....' # See ri Array.pack

def data
  @data ||= packed_data.unpack(UNPACK_FORMAT)
end
def data=(v)
  @data = v
end

def reload(options=nil)
  @data = nil
  super
end

def pack_data
  self.packed_data = self.data.pack(UNPACK_FORMAT)
  true # Because we are in a before_.. callback
end

The format of the magic string used to pack/unpack the data depends on the data you have in your array. The documentation will help you to choose the right one.

I believe the format for pack and unpack will be the same, but don't trust me too much. ;)

0

精彩评论

暂无评论...
验证码 换一张
取 消