Прозрачное сжатие атрибутов перед сохранением в базе данных в Rails - PullRequest
2 голосов
/ 11 февраля 2012

Одна из моих моделей имеет огромный текстовый столбец, который я хотел бы сжать перед сохранением его в базе данных (не для экономии места на диске, а потому, что я не хочу отправлять несжатое поле по проводам из мой сервер БД для моего сервера приложений)

Моя база данных postgresql, если это актуально

Вот расширение я пытался писать, но по каким-то причинам это не работает в производстве (данные на самом деле получить хранятся в базе данных выглядит как гекс (например, «34bee1c2d099ba21da3ac533d5f99cda2654feb73985430df39c5ffd8fbf9d9ff3aa9392d5a5» вместо вывода Zlib (например, «A \ xEB \ XD3 \ xF2Oy = \ x9C \ x7F5 \ xE9 \ xC44 \ x01M \ "). Не уверен, что происходит

module HasCompressedAttributes
  def self.included(base)
    base.extend ClassMethods
  end

  module ClassMethods
    def has_compressed_attributes(*fields)
      fields.each do |field|
        define_method(:"#{field}=") do |uncompressed|
          write_attribute(:"#{field}", Zlib::Deflate.deflate(uncompressed))
        end

        define_method(:"#{field}") do
          Zlib::Inflate.inflate(read_attribute(:"#{field}")) rescue nil
        end
      end
    end
  end
end

ActiveRecord::Base.class_eval{ include HasCompressedAttributes }

Есть ли лучший подход здесь? Может быть, существующий драгоценный камень?

1 Ответ

1 голос
/ 12 февраля 2012

Метод кодирования по умолчанию для bytea в последних версиях PostgreSQL: "hex" :

Формат "hex" кодирует двоичные данные в виде 2 шестнадцатеричных цифр на байтСамый значительный клев в первую очередь.Всей строке предшествует последовательность \ x (чтобы отличить ее от escape-формата).

Итак, материал 34bee1c2d099ba21da3ac..., который вы видите в базе данных, - это просто шестнадцатеричные двоичные данные.AR должен кодировать и декодировать эти вещи для вас, если вы используете столбец bytea (т.е. t.binary при создании столбца), а не text или varchar (т.е. t.text или t.string).Если вы собираетесь хранить двоичные данные в базе данных, вам придется использовать t.binary, чтобы вы не могли полностью скрыть эту магию внутри модуля, схема также должна быть правильно настроена.

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