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 =>
)来处理这种情况。