在 Rails 3.2 中修改 Postgres JSON 字段时出错

Error when modifying Postgres JSON field in Rails 3.2

我正在尝试在我的 Rails 3.2 应用程序中使用 JSON(Postgres 9.3,所以不是 JSONB)字段类型。

我使用以下迁移创建了字段,没有问题:

def change
  add_column :blocks, :meta, :json
end

但是,当我尝试像这样修改字段时:

b.meta = {name: "John"}
b.save

我收到以下错误:

ActiveRecord::StatementInvalid: PGError: ERROR:  invalid input syntax for type json
LINE 1: UPDATE "blocks" SET "meta" = '---

我什至不确定 Rails 3.2 是否支持 JSON 类型,但我看到一些帖子尽可能地谈论它(尽管没有详细说明它是如何工作的)。

我认为你说得对 Rails 3 中的 ActiveRecord 本身不支持 JSON。你的错误原因是给定一个复杂的数据类型(在本例中是一个 Hash),ActiveRecord 会首先将它序列化为一个字符串,默认的序列化是 YAML。这就是错误消息中 --- 的来源——它是 YAML header.

一个快速的解决方案是在将哈希分配给您的属性之前将其转换为 JSON:

hsh = { name: "John" }
b.meta = hsh.to_json
b.save

不过,这很快就会变得乏味。相反,您可以告诉 ActiveRecord 在序列化此属性时使用 JSON 而不是 YAML:

class Block < ActiveRecord::Base
  serialize :meta, JSON
end