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

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

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

User model serialize: invites invites = text field 

现在我想做两件事:

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

从精细手册 :

serialize(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) 

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

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

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