【问题标题】:How to save a hash or json string into a jsonb field如何将哈希或 json 字符串保存到 jsonb 字段中
【发布时间】:2016-02-12 10:36:50
【问题描述】:

我有一个来自"{\"en\":\"Lorem\"}" 的活跃管理员的 json 字符串

我想把它保存在我的 question.name 字段中,它是 postgres jsonb 类型的。

class Question < ActiveRecord::Base
  serialize :name
end

# db/schema.rb
create_table "preset_questions", force: :cascade do |t|
  t.jsonb    "name",               default: {}
end

我尝试了以下方法:

question.update(name:"{\"en\":\"Lorem\"}")
question.update(name:JSON.parse("{\"en\":\"Lorem\"}"))

两者的结果:

question.name
=> nil

【问题讨论】:

  • 在执行此操作时让检查控制台中的任何错误? 2 你的命令应该可以正常工作!

标签: ruby-on-rails json postgresql


【解决方案1】:

通过删除 serialize :name 使其工作。鉴于列类型为 jsonb

,看起来 rails 已经知道该怎么做了
class Question < ActiveRecord::Base
end

# db/schema.rb
create_table "preset_questions", force: :cascade do |t|
  t.jsonb    "name",               default: {} 
end

question.update(name:"{\"en\":\"Lorem\"}")
question.update(name:JSON.parse("{\"en\":\"Lorem\"}"))

都返回

question.name
=> {"en"=>"lorem", "id"=>"ipsum"}

【讨论】:

  • 我正在使用 Rails 5.1.4,似乎在 JSONB 字段中保存 json 字符串会将其保存为字符串而不是哈希
  • 从我发现这是从 v5.0.0 开始的新行为这里是源 github.com/rails/rails/commit
【解决方案2】:

在 Rails 中,您可以在 ActiveRecord 模型中指定它必须在保存列之前对其进行序列化,并在读取后对其进行反序列化。它使您能够将任何结构保存在数据库的字符串列中。

class Question < ActiveRecord::Base
   serialize :name
end

然后你可以像这样保存你的哈希:

question.update(name: {en: "Lorem"} }

文档:http://api.rubyonrails.org/classes/ActiveRecord/AttributeMethods/Serialization/ClassMethods.html

【讨论】:

  • 嗯,只是你必须在数据库中有一个字符串列,并且你必须将哈希本身作为更新的参数,而不是已经序列化的版本它。
猜你喜欢
  • 2020-10-07
  • 2011-12-04
  • 2017-10-28
  • 2013-07-06
  • 1970-01-01
  • 2017-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多