如何在不使用数据库的情况下将 Ruby 对象存储在我的 Rails 应用程序中?

How do I store a Ruby object in my Rails app without using a database?

给定


Objective

保存此测验对象以供应用的所有用户稍后访问。


问题

如何在 Rails 6.0 中存储和访问此测验对象而不在数据库中表示它?


可能的解决方案


到目前为止我检查过的内容

SO - Store json object in ruby on rails app:因为这是JSON,所以在JSON格式和解析格式之间来回比较直观。

:这个问题我真的没有答案。一些链接已损坏。不过,我认为这个问题非常相似。

Is it possible to use Marshal to pickle the object and save it to be used later?

是的,使用与示例相同的代码,您可以序列化和反序列化对象以恢复它原来的样子。

irb(main):021:0> marshalled = Marshal.dump(ch1_history_quiz)
=> "\x04\bo:\tQuiz\n:\v@topicI\"\x0EChapter 1\x06:\x06ET:\f@courseI\"\fHistory\x06;\aT:\x13@highest_gradeii:\x13@failing_gradeiF:\x1A@answers_by_questions{\x06I\"6Which ancient civilisation created the boomerang?\x06;\aTI\"\eAboriginal Australians\x06;\aT"
irb(main):022:0> deserialized = Marshal.load(marshalled)
=> #<Quiz:0x00007f81d3995348 @topic="Chapter 1", @course="History", @highest_grade=100, @failing_grade=65, @answers_by_questions={"Which ancient civilisation created the boomerang?"=>"Aboriginal Australians"}>

另一个更具可读性的选项是以 YAML 格式序列化您的对象:

irb(main):030:0> yamled = YAML.dump(ch1_history_quiz)
=> "--- !ruby/object:Quiz\ntopic: Chapter 1\ncourse: History\nhighest_grade: 100\nfailing_grade: 65\nanswers_by_questions:\n  Which ancient civilisation created the boomerang?: Aboriginal Australians\n"
irb(main):031:0> deserialized = YAML.load(yamled)
=> #<Quiz:0x00007f81d398cb80 @topic="Chapter 1", @course="History", @highest_grade=100, @failing_grade=65, @answers_by_questions={"Which ancient civilisation created the boomerang?"=>"Aboriginal Australians"}>

使用这两个选项中的任何一个,您都可以稍后将其保存在数据库文本字段中(有足够 space 来保存大对象)、纯文本文件或您选择的任何内容。
此外,需要牢记的非常重要的一点是 the security issues 关于使用 marshal 或 yaml,因此必须始终从受信任的来源加载对象。