gpt4 book ai didi

ruby-on-rails - 更新 Rails 4 和 PostgreSQL json 列中的单个键/值对?

转载 作者:行者123 更新时间:2023-11-29 11:11:01 25 4
gpt4 key购买 nike

我有一个相当大的 json 文档,我必须将其存储在应用程序中每个评估实例的字段中。随着时间的推移,应用程序上的某些操作将要求我更改文档中的各种键/值对。 Rails 4 和 PostgreSQL json 数据类型似乎是解决此问题的理想选择,但我无法将更改提交到数据库。

这是一个简化的工作流程:

我有一个 json 文件,我将其导入到每个评估记录的字段中:

// example.json
{ "question_1":"no" }

我创建一条记录并导入 json:

>> evaluation = Evaluation.create assessments: File.read("example.json")
>> evaluation.assessments = File.read("#{Rails.root}/example.json")
=> "{ \"question_1\":\"no\" }"

调用评估字段似乎工作正常:

>> evaluation.assessments
=> {"question_1"=>"no"}

OR

>> evaluation.assessments["question_1"]
=> "no"

例子1

更改 json 效果不佳。这实际上并没有提交任何内容:

>> evaluation.assessments["question_1"] = "yes"
=> "yes"

>> evaluation.assessments["question_1"]
=> "yes"

>> evaluation.save
(0.3ms) BEGIN
(0.2ms) COMMIT
=> true

示例#2

替换为一个全新的对象提交:

>> evaluation.assessments = {"question_1"=>"yes"}
=> {"question_1"=>"yes"}

>> evaluation.save
(0.3ms) BEGIN
SQL (0.7ms) UPDATE "evaluations" SET "assessments" = $1, "updated_at" = $2 WHERE "evaluations"."id" = 1 [["assessments", "{\"question_1\":\"yes\"}"], ["updated_at", "2014-08-21 00:52:03.581817"]]
(3.8ms) COMMIT
=> true
  • 我在示例 #1 中做错了什么?
  • 当我调用它、更改值并在实例上调用保存时,数据库为什么不提交我对 evaluation.assessment 列所做的更改?

最佳答案

由于与 ActiveRecord 相关的已知错误不知道更改的属性是脏的,这最终成为一个简单的修复:

https://github.com/rails/rails/issues/6127

解决方法如下:

>> evaluation.assessments["question_1"] = "yes"
=> "yes"

>> evaluation.assessments_will_change!
>> evaluation.save
(1.1ms) BEGIN
SQL (1.6ms) UPDATE "evaluations" SET "assessments" = $1, "updated_at" = $2 WHERE "evaluations"."id" = 4 [["assessments", "{\"question_1\":\"yes\"}"], ["updated_at", "2014-08-21 01:59:47.331216"]]
(2.5ms) COMMIT
=> true

关于ruby-on-rails - 更新 Rails 4 和 PostgreSQL json 列中的单个键/值对?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25416997/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com