Более сложная сериализация объектов ActiveRecord - PullRequest
1 голос
/ 27 декабря 2011

У меня есть модель, и в этой модели я создаю более сложное поле, чем раньше. Я сериализовал хэши и массивы, но это поле является результатом Gibberish :: RSA.generate_keypair (https://github.com/mdp/gibberish). На мой взгляд, это более или менее пара закрытых / открытых ключей в оболочке ruby.

Работая из командной строки, я могу выполнить update_attributes, и результат генерации будет сохранен в текстовом поле. При выполнении rake db: seed или создании экземпляра это не работает, я получаю строку yaml, которая указывает на несколько типов объектов Gibberish.

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

Код:

  def generate_keypair
    self.update_attributes(:rsakey => Gibberish::RSA.generate_keypair(1024) )
  end

, который я призываю к созданию связанной модели, базовый вызов оболочки Гиббериш

Тогда вывод я получу для поля myresource.rsakey

"--- !ruby/object:Gibberish::RSA::KeyPair\nkey:
!ruby/object:OpenSSL::PKey::RSA {}\ncipher:
!ruby/object:OpenSSL::Cipher::Cipher {}\n"

Обновление атрибутов работает из командной строки rails, но не при заполнении или создании. Другие способы, которыми я пытался добавить сериализацию, полностью разрушили процесс или созданные экземпляры.

РЕДАКТИРОВАТЬ: решается прямо, просто вызывая to_s в результате метода генерации пары ключей, который просто сохраняет его как текстовое поле, которое «работает на данный момент», пока оно не должно стать более элегантным.

1 Ответ

0 голосов
/ 27 декабря 2011

Основная проблема заключается в том, что библиотека openssl не поддерживает дамп YAML:

YAML.dump(OpenSSL::PKey::RSA.generate(1024))
#=> "--- !ruby/object:OpenSSL::PKey::RSA {}"

Если вы используете рельсы 3.1, вы можете определить собственные сериализаторы, например:

class KeySerializer
  def dump(key)
    key.to_pem
  end

  def load(data)
    data && OpenSSL::Pkey::RSA.new(data)
  end
end

Тогда в вашем классе вы можете сделать

class Foo < ActiveRecord::Base
  serialize :key, KeySerializer.new
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...