【问题标题】:Error when modifying Postgres JSON field in Rails 3.2在 Rails 3.2 中修改 Postgres JSON 字段时出错
【发布时间】:2015-04-21 02:42:45
【问题描述】:

我试图在我的 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 类型,但我已经看到一些帖子尽可能地谈论它(尽管没有关于它如何工作的详细信息)。

【问题讨论】:

    标签: ruby-on-rails postgresql ruby-on-rails-3.2 postgresql-9.3


    【解决方案1】:

    我认为 Rails 3 中的 ActiveRecord 本身不支持 JSON 是正确的。您的错误的原因是给定复杂的数据类型(在本例中为 Hash),ActiveRecord 将首先将其序列化为字符串,并且默认序列化为 YAML。这就是您的错误消息中的 --- 的来源——它是 YAML 标头。

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

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

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

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

    【讨论】:

    • 谢谢,我选择了第二种解决方案。这对性能有何影响?与 ActiveRecord 4.2 附带的对 JSON 类型的集成支持相比(当然忽略所有其他差异),此选项有什么明显的缺点吗?
    • 对于简单的对象,我认为您不会看到太大的性能影响(如果有的话)。对于大型、深度嵌套的对象,您可能会这样做,但很难说。与性能问题的答案一样:如果您真的需要知道,请对其进行分析。我不知道 ActiveRecord 4.2 的 JSON 支持如何比较。看起来性能应该非常相似,但 AR 4.2 可能会做一些我不知道的缓存或其他优化。
    猜你喜欢
    • 2020-11-08
    • 1970-01-01
    • 1970-01-01
    • 2017-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多