如何在数据库列中序列化整数(用户ID范围为1到9999)并将其检索回来?
在我的用户模型中,我邀请了专栏
User model
serialize: invites
invites = text field
现在我正在尝试做两件事:
答案 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 =>
)来处理这种情况。