Сериализация на блоб в рельсах 3 - PullRequest
2 голосов
/ 26 ноября 2010

У меня есть приложение rails, где одним из атрибутов объекта является набор данных, который состоит из массива координат x, y.В настоящее время я храню это в базе данных sql с помощью помощника rails serialize:

serialize: data, Array

Это преобразует массив в yaml и затем сохраняет его в строковом поле в базе данных sql,Проблема в том, что наша база данных становится действительно большой, и мы должны держать ее меньше.Можно ли сериализовать в необработанный двоичный файл вместо строки и сохранить в BLOB-объекте? Это значительно уменьшит размер и поможет решить нашу проблему.

У меня был поиск драгоценного камня, чтобы сделать это, или даже метод ruby, который превратит массив в двоичные данные без особой помощи.Любые предложения будут оценены.

1 Ответ

1 голос
/ 26 ноября 2010

Вас могут заинтересовать методы Array.pack и String.unpack. См. Документацию ruby ​​для этого: введите ri Array.pack

Возможно, вы захотите использовать атрибут «pack_data» в своей базе данных, а затем добавить средства доступа для его упаковки / распаковки:

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

Чтобы сделать его более полезным, вы можете сохранить распакованную форму в переменной, но вы должны не забыть очистить ее при изменении атрибута packed_data, например, когда вы вызываете .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

Формат магической строки, используемой для упаковки / распаковки данных, зависит от данных, имеющихся в вашем массиве. Документация поможет вам выбрать правильный.

Я считаю, что формат для pack и unpack будет одинаковым, но не слишком доверяйте мне. ;)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...