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

时间:2016-02-16 21:09:59

标签: ruby-on-rails arrays postgresql activerecord rails-activerecord

我的模型上有数组并设置,当我将数组写入记录时,它表示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
=> []

如何在模型上保留数组?

2 个答案:

答案 0 :(得分:4)

如果您正在使用本机PostgreSQL阵列(因为您在迁移中已经array: true),那么您根本不应该使用serializeserialize用于在数据库中存储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的全部内容来查询serializeawk '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
相关问题