如何在Ruby on Rails中将数组持久化存储到数据库中?

5
我正在尝试将一个数组的数组持久化到我的Rails SQLite数据库中。
目前,我有一个可以容纳这样一个数组的对象,并且实例似乎保存没有问题。然而,显然它并未被持久化到数据库中——当我在与创建该数组不同的视图中调用My_Object.array函数时,它会变成nil并且无法工作。
例如:
class My_Object < ActiveRecord::Base
  attr_accessor :array
end

当我调用My_Object.new(:array => [ [1, 2, 3], [4, 5, 6] ])时,一切似乎正常工作,但是我无法在其他任何地方访问:array属性,它只是变成了nil。
有什么想法吗?
1个回答

12

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

class My_Object < ActiveRecord::Base
  serialize :array
end

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

不过,您应该重新考虑您的设计。您将无法在数据库中处理序列化数据,特别是您将无法在查询中使用它。YAML只是进入和离开数据库的不透明块,数据库无法对其进行其他任何操作。如果您确定数据库永远不需要查看array内部,那么请使用serialize,否则您需要设置额外的表来存储数组数据。


实际应用程序将几乎完全使用此数组... 我只是试图将康威的生命游戏实现到一个Rails应用程序中,使用一个“Game”对象来保存初始数组--这个数组基本上是整个应用程序中将要使用的全部内容,因为整个重点是通过算法运行它以获取新的点。使用“serialize”甚至可能吗?我应该重新设计整个程序吗? - Benjamin Kovach
1
@Benjamin:对于这种情况,serialize 应该是可以的。 - mu is too short
3
一个小细节:如果你想要强制一个数组,可以使用 serialize :array, Array - Swanand
@Swanand:谢谢,值得一提。 - mu is too short
只是为了澄清,:array 对象本身由数组组成对此没有影响吗?我不需要在父数组的每个成员上调用 serialize,是吗? - Benjamin Kovach
1
@Benjamin:只需要使用serialize :array就足够了。如果你想要更明确,可以使用serialize :array, Array。但我认为在serialize中没有办法表达“数组或数组”的意思。 - mu is too short

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接