newbie:将序列化整数附加到数据库列中并将其检索回来

时间:2012-02-28 16:30:37

标签: ruby-on-rails ruby-on-rails-3 serialization activerecord deserialization

如何在数据库列中序列化整数(用户ID范围为1到9999)并将其检索回来?

在我的用户模型中,我邀请了专栏

User model
serialize: invites
invites = text field

现在我正在尝试做两件事:

  • 在“邀请”栏中附加序列化的user_id整数(从1到9999)
  • 从User.invited列中检索所有用户ID(反序列化它?)

1 个答案:

答案 0 :(得分:2)

来自fine manual

  

序列化(attr_name,class_name = Object)

     

如果您有一个属性需要作为对象保存到数据库,并作为同一对象检索,则使用此方法指定该属性的名称,它将自动处理。序列化是通过YAML完成的。如果指定了class_name,则序列化对象必须在检索时属于该类,否则将引发SerializationTypeMismatch

因此,如果要将整数数组存储为序列化对象,则:

class User < ActiveRecord::Base
    serialize :invites, Array
    #...
end

您希望invites列成为数据库中的text列(而不是string!),以避免遇到大小问题。

然后您可以将user.invites视为普通数组:

user.invites = [ 1, 2, 3 ]
user.invites.push(11)

当然,这并不能验证这些数字是否有效,或者你没有重复数据(但你可以使用Set代替数组),它也不会阻止你在那里放一个字符串。

我不建议你这样做,序列化几乎总是一个错误,以后会再次咬你。就数据库而言,序列化列是一个不透明的数据块:您无法就地更新它,您无法查询它,您所能做的就是将其从数据库中取出并将其放回原处。 serialize使用YAML进行序列化,如果您需要处理数据库中的序列化数据,那么这是一种糟糕的格式;您还可以在升级期间遇到interesting encoding issues

最好设置一个传统的关联表和一个单独的模型(可能使用has_many ... :through =>)来处理这种情况。