在 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
我正在尝试在我的 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