【问题标题】:How can I persist an array to the database in Ruby on Rails?如何在 Ruby on Rails 中将数组持久化到数据库中?
【发布时间】:2025-12-28 15:30:12
【问题描述】:

我正在尝试将一个数组数组持久化到我在 Rails 中的 SQLite 数据库中。

现在,我有一个可以容纳这样一个数组的对象,并且实例似乎可以毫无问题地保存。但是,它显然没有被持久化到数据库中——当我在与创建数组的视图不同的视图中调用 My_Object.array 上的函数时,它显示为 nil 并且不起作用。

例如:

class My_Object < ActiveRecord::Base
  attr_accessor :array
end

当我调用 My_Object.new(:array =&gt; [ [1, 2, 3], [4, 5, 6] ]) 时,一切似乎都正常工作,但我无法在其他任何地方访问 :array 属性,结果是 nil。

有什么想法吗?

【问题讨论】:

    标签: ruby-on-rails ruby database arrays


    【解决方案1】:

    首先在表中创建一个名为array 的文本列。然后使用serialize:

    class My_Object < ActiveRecord::Base
      serialize :array
    end
    

    这将使用 YAML 自动序列化您的数组,并在您将其从数据库中拉回时自动解包。

    不过,您应该重新考虑您的设计。您将无法对数据库中的序列化数据执行任何操作,尤其是您将无法在查询中使用它。 YAML 将只是一个不透明的 blob,它进入数据库并返回,数据库将无法用它做任何其他事情。如果您确定数据库永远不需要查看 array 内部,请继续使用 serialize,否则您需要设置额外的表来存储数组数据。

    【讨论】:

    • 实际的应用程序将几乎完全使用这个数组......我只是想将康威的生活游戏实现到一个rails应用程序中,使用Game对象来保存初始数组——这个数组基本上是整个应用程序中将使用的所有内容,因为重点是通过算法运行它以获得新点。这甚至可以使用serialize 吗?我应该只重做整个程序吗?
    • @Benjamin:serialize 应该适合这样的事情。
    • 一个小问题:如果你想强制一个数组,你可以使用serialize :array, Array
    • @Swanand:谢谢,值得一提。
    • @Benjamin:serialize :array 就足够了。如果你想明确一点,你可以说serialize :array, Array,但我认为没有办法用serialize 说“数组或数组”。