2010-11-26 6 views
2

私は、オブジェクト上の属性の1つがx、y座標の配列からなるデータセットであるレールアプリを持っています。レール内のブロブへのシリアライズ3

シリアル化:データ、アレイ

これはYAMLに配列を変換し、SQLデータベースに文字列フィールドに格納する私は現在、ヘルパーをシリアライズレールを使用して、SQLデータベースでこれをまた保管しています。問題は、データベースが非常に大きくなっているため、小さくする必要があるということです。文字列の代わりに生のバイナリにシリアル化してBLOBに格納することは可能ですか?これはサイズを大幅に縮小し、私たちの問題を解決します。

私はこれを行うための宝石、または大した助けなしにバイナリデータに配列を変換するルビメソッドを検索しました。任意の提案をいただければ幸いです。

答えて

1

あなたはArray.packとString.unpackメソッドに興味があるかもしれません。それのためにルビーのマニュアルを参照してください:タイプri Array.pack

あなたはそれを解凍/パックするアクセサを追加し、あなたのデータベース「packed_data」属性を使用することもできます。

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

それをより便利にするために、あなたは可能変数にアンパックフォームを保存していますが、.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 

を呼び出すときに解凍/データをパックするために使われるマジック文字列の形式が依存するようにあなたは、ときpacked_data属性の変更、それをクリアするために覚えていますあなたが持っているデータあなたの配列内のe。ドキュメントは、あなたが正しいものを選択するのに役立ちます。

私はpackとunpackのフォーマットは同じであると信じていますが、私をあまり信用していません。 ;)

関連する問題