【问题标题】:More complex ActiveRecord object serialization更复杂的 ActiveRecord 对象序列化
【发布时间】:2011-12-26 20:12:19
【问题描述】:

我有一个模型,在该模型中,我生成了一个比以前更复杂的字段。我已经序列化了哈希和数组,但是这个字段是 Gibberish::RSA.generate_keypair (https://github.com/mdp/gibberish) 的结果。据我了解,这或多或少是 ruby​​ 包装器中的私钥/公钥对。

从命令行工作,我可以执行 update_attributes 并将生成的结果存储在文本字段中。在执行 rake db:seed 或创建实例时,这不起作用,我得到一个 yaml 字符串,指示几种类型的 Gibberish 对象。

除了散列和数组之外,我如何进行更复杂的 activerecord 序列化?或者我如何更深入地了解我正在尝试做的事情?

代码:

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

我调用相关的模型创建,基本调用 Gibberish 包装器

然后我得到的字段 myresource.rsakey 的输出

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

更新属性可以通过 rails 命令行进行,但不能在播种或创建时进行。到目前为止,我尝试添加序列化的其他方式完全破坏了进程或创建的实例。

编辑:直接通过在密钥对生成方法的结果上调用“to_s”来解决,这只是将其保存为“暂时可用”的文本字段,直到它需要更优雅。

【问题讨论】:

  • 你为什么在这里使用serialize?当您可能只需要钥匙时,为什么还要打扰所有unstable YAML 的废话?
  • 我不知道,只是从用 activerecord 做事——yaml 是基本的序列化程序。我真的希望超越这一点,这个问题的基础是关于我为什么要这样做,如果有另一种方法可以追求的话。此外,密钥是适合 yaml rails 配置的较大包的一部分,它可以保持一切整洁,我不需要处理密钥文件夹

标签: ruby-on-rails ruby serialization activerecord


【解决方案1】:

根本问题似乎是 openssl 库没有实现 YAML 转储:

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

如果您使用的是 rails 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多