Rails无法写入数据库中的序列化数组字段

我在我的模型上设置了数组,当我将数组写入我的记录时,它表示COMMIT为true,但在返回空数组后立即检查该记录上的字段。

模型:

class Feature < ActiveRecord::Base serialize :content, Array attr_accessible :content end 

移民:

 class AddContentToFeatures < ActiveRecord::Migration def change add_column :features, :content, :text, array: true, default: [] end end 

我尝试过的,以及各种符号和字符串语法,是这样的:

 > f=Feature.new > f.content_will_change! #i feel like i shouldn't have to do this > f.content = ['sadasd','asdasd'] > f.save! BEGIN COMMIT => true > f.content => [] 

如何在模型上保留数组?

如果您使用的是本机PostgreSQL数组(因为您有array: true迁移时为array: true ),那么您根本不应该使用serializeserialize用于在数据库中存储YAML:

serialize (attr_name,class_name_or_coder = Object)

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

因此serialize只是将YAML编码的对象存储在数据库的text列中。 但是PostgreSQL,Rails4中的ActiveRecord以及底层的PostgreSQL驱动程序都能理解arrays而不会出现YAML的所有不愉快。

在迁移中保留array: true serialize :content, Array从模型中删除serialize :content, Array ,它应该可以正常工作。 作为额外的好处,您将能够使用PostgreSQL的所有数组运算符和函数来查询您的contentserialize不允许您这样做。

Rails的序列化程序的默认数据结构是一个哈希,你没有保存到f.content

要将数组保存到序列化内容,请在function模型中尝试以下操作:

 serialize :content, Array