2010-11-26 6 views
2

J'ai une application rails où l'un des attributs d'un objet est un ensemble de données qui consiste en un tableau de coordonnées x, y. Je suis actuellement Storring cela dans la base de données SQL en utilisant les rails sérialisation aide:Sérialisation à blob dans les rails 3

sérialisation: données, Array

Ce convertit le tableau en YAML, puis il stocke dans un champ de chaîne dans la base de données SQL. Le problème est que notre base de données devient très importante et nous devons la réduire. Est-il possible de sérialiser en binaire brut au lieu d'une chaîne et stocker dans un blob ?, Cela réduirait considérablement la taille et aider notre problème.

J'ai eu une recherche d'une gemme pour le faire, ou même une méthode ruby ​​qui va transformer un tableau en données binaires sans beaucoup d'aide. Toute suggestion serait appréciée.

Répondre

1

Vous pouvez être intéressé par les méthodes Array.pack et String.unpack. Voir la documentation de rubis pour elle: Type ri Array.pack

Vous pouvez utiliser un attribut « packed_data » dans votre base de données, puis ajouter accesseurs pour emballer/déballer:

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

Pour le rendre plus utile, vous pouvez stocker la forme décompressé dans une variable, mais vous devez vous rappeler de l'effacer lorsque l'packed_data attribut change, comme lorsque vous appelez .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 

le format de la chaîne magique utilisée pour emballer/déballer les données dépend de la les données que vous avez e dans votre tableau. La documentation vous aidera à choisir la bonne.

Je crois que le format pour pack et unpack sera le même, mais ne me faites pas trop confiance. ;)