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
),那么您根本不应该使用serialize
。 serialize
用于在数据库中存储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的所有数组运算符和函数来查询您的content
, serialize
不允许您这样做。
Rails的序列化程序的默认数据结构是一个哈希,你没有保存到f.content
。
要将数组保存到序列化内容,请在function模型中尝试以下操作:
serialize :content, Array
- 在Rails测试中更新ActiveRecord
- Rails按以下方式对表进行分组:created_at,返回:status列的计数,然后将:status列分组,每个唯一值的计数
- find_or_create_by_id的最佳方法,但如果找到记录则更新属性
- Rails ActiveRecord与has_many关联相交查询
- Rails accepted_nested_attributes_for child在validation时没有父集
- Rails 2.3.x – 这个ActiveRecord范围如何工作?
- 命名范围仅搜索连接表的第一个结果
- 如何迭代ActiveRecord属性,包括attr_accessor方法
- 访问params 值内的参数数组