我的模型上有数组并设置,当我将数组写入记录时,它表示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
=> []
如何在模型上保留数组?
答案 0 :(得分:4)
如果您正在使用本机PostgreSQL阵列(因为您在迁移中已经array: true
),那么您根本不应该使用serialize
。 serialize
用于在数据库中存储YAML:
序列化(attr_name,class_name_or_coder = Object)
如果您有一个属性需要作为对象保存到数据库,并作为同一对象检索,则使用此方法指定该属性的名称,它将自动处理。序列化是通过YAML完成的。如果指定了
class_name
,则序列化对象必须在赋值和检索时属于该类。否则将引发SerializationTypeMismatch
。
因此serialize
只是将YAML编码的对象存储在数据库的text
列中。但是PostgreSQL,Rails4中的ActiveRecord以及底层的PostgreSQL驱动程序都能理解数组而没有YAML的所有不愉快。
在迁移中保留array: true
,从模型中删除serialize :content, Array
,它应该可以正常工作。作为额外的奖励,您可以使用content
的全部内容来查询serialize
,awk 'NR==FNR{a[$0]=1;next;}/^([[:digit:]]+[[:blank:]]+){2}[[:digit:]]+$/{f=a[$0]}f' file1 file2
不允许您执行此操作。
答案 1 :(得分:1)
Rails的默认数据结构&#39;序列化程序是一个哈希,你没有保存到f.content
。
要将数组保存到序列化内容,请在功能模型中尝试以下操作:
serialize :content, Array