Обновление одной пары ключ / значение в столбце Rails 4 и PostgreSQL json?
у меня есть довольно большой документ 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
замена на совершенно новый объект тут commit:
>> evaluation.assessments = {"question_1"=>"yes"}
=> {"question_1"=>"yes"}
>> evaluation.save
(0.3ms) BEGIN
SQL (0.7ms) UPDATE "evaluations" SET "assessments" = , "updated_at" = WHERE "evaluations"."id" = 1 [["assessments", "{"question_1":"yes"}"], ["updated_at", "2014-08-21 00:52:03.581817"]]
(3.8ms) COMMIT
=> true
- что я делаю неправильно в Пример #1?
- почему база данных не зафиксирует изменения, которые я сделал в
evaluation.assessment
столбец когда я вызываю его, измените значение и вызовите save на экземпляре?
1 ответов
это оказалось простым исправлением из-за известной ошибки, связанной с 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" = , "updated_at" = WHERE "evaluations"."id" = 4 [["assessments", "{\"question_1\":\"yes\"}"], ["updated_at", "2014-08-21 01:59:47.331216"]]
(2.5ms) COMMIT
=> true