Rails Postgre 问题:数组文字格式错误,数组值必须以“”或维度信息开头

Posted

技术标签:

【中文标题】Rails Postgre 问题:数组文字格式错误,数组值必须以“”或维度信息开头【英文标题】:Rails Postgre issue: malformed array literal, Array value must start with "" or dimension informationRails Postgre 问题:数组文字格式错误,数组值必须以“”或维度信息开头 【发布时间】:2017-10-02 14:25:06 【问题描述】:

我在 Heroku 上为我的 Rails 应用创建了一个新的迁移。它添加了一些这样的 Array 列:

t.string :timezone, array: true, default: [].to_yaml
t.string :locale, array: true, default: [].to_yaml

我在尝试迁移时收到以下错误:

ActiveRecord::StatementInvalid: PG::InvalidTextRepresentation: 错误: 格式错误的数组文字:“--- []” 详细信息:数组值必须以开头 带有“”或维度信息。 :创建表“过滤器”(“id” 序列主键,“letter_id”整数,“性别”字符变化, “时区”字符变化[] DEFAULT '--- []',“区域设置”字符 变化[]默认'--- []

这是我的模型:

class Filter < ApplicationRecord
  belongs_to :letter
  serialize :timezone
  serialize :locale
  serialize :segment
  validates_uniqueness_of :letter_id
end

*** 上的一些人说删除序列化可以解决问题,但我需要存储一个数组,而不是字符串。

知道如何解决这个问题吗?

【问题讨论】:

【参考方案1】:

你为什么不这样做:

t.text :your_table, :timezone, default: []
t.text :your_table, :locale, default: []

不知道为什么你会调用to_yaml 来获取默认值。此外,您应该使用 text 列类型,因为默认情况下字符串可能会将您限制为 255 个字符。

【讨论】:

【参考方案2】:

最后,我做了以下并解决了我的问题:

t.string :timezone, :string
t.string :locale, :string

并通过序列化保留我的模型。

【讨论】:

以上是关于Rails Postgre 问题:数组文字格式错误,数组值必须以“”或维度信息开头的主要内容,如果未能解决你的问题,请参考以下文章

将包含对象数组的 json 传递给 PostgreSQL 函数会引发格式错误的数组文字。意外的数组元素

Rails:错误多个文件上传,空数组

Django 数据库迁移错误(sqlite3->postgre)

添加带有rails迁移错误的整数数组列

Jooq postgre 在 play2.5 scala 中插入错误

PostgreSQL 通知和带有 Rails 的 WebSockets