使用 rails 在数据库中序列化 json 的正确方法

Proper way to serialize json in database with rails

假设我有这种json。

在rails中,我有三个模型:

部分有很多问题

问题有一个答案

在数据库中save/update它的正确方法是什么?

提前感谢您的帮助

{
"id": 1,
"section_name_fr": "Section1",
"section_number": 1,
"questions": [
{
    "id": 2,
    "question_fr": "Question12FR",
    "input_type": "textarea",
    "answer": {
        "id": 1,
        "answer": "Blabla"
    }
},
{
    "id": 4,
    "question_fr": "Question14FR",
    "input_type": "tel",
    "answer": null
}
]
}

假设您的示例 json 在变量 json 中。然后我们可以:

section_attributes = JSON.parse(json).symbolize_keys
# update section
section = Section.find_or_create_by id: section_attributes[:id]
section.update_attributes! section_attributes.slice(:section_name_fr, :section_number)
section_attributes[:questions].each do |question_attributes|
  # update question
  question = section.questions.find_or_create_by id: question_attributes[:id]
  question.update_attributes! question_attributes.slice(:question_fr, :input_type)
  # update answer
  (question.answer || question.build_answer).update_attributes question_attributes[:answer].slice(:answer)
end

请注意,这对您希望 saving/updating 的行为方式做出了一些假设。例如,对于问题,我们尝试使用给定的 ID 在给定的部分中找到一个已经存在的问题。如果找不到,我们会创建一个。但是,您可能希望搜索具有给定 ID 的 any 问题并与该部分相关联。在这种情况下,您可以将更新问题行替换为:

question = Question.find_or_create_by id: question_attributes[:id]
question.update_attributes! question_attributes.slice(:question_fr, :input_type).merge(section_id: section.id)

另请注意,出于安全原因,对属性哈希使用 slice 很重要。特别是,它定义了允许 json 修改哪些属性。

首先,您需要将 json 转换为散列 ruby 格式:

json ='{
"id": 1,
"section_name_fr": "Section1",
"section_number": 1,
"questions": [
             {
              "id": 2,
              "question_fr": "Question12FR",
              "input_type": "textarea",
              "answer": {
                        "id": 1,
                        "answer": "Blabla"
                        }
             },
              {
               "id": 4,
               "question_fr": "Question14FR",
               "input_type": "tel",
               "answer": null
              }
 ]
 }'

hash_ruby = JSON.parse(json)

然后

section = Section.find_or_create(id:hash_ruby["id"])
section.name_fr = hash_ruby["section_name_fr"]
section.number = hash_ruby["section_number"]
section.save
hash_ruby["questions"].each do |q|
  new_question = Question.find_or_create(id:q["id"])
  new_question.question_fr = q["question_fr"]
  new_question.input_type = q["input_type"]
  if !(q["answer"].nil?)
    answer = Answer.find_or_create(id:q["anwser"]["id"])
    answer.anwser = q["anwser"]["anwser"]
    answer.save
    new_question.answer=answer
  end
  new_question.section = section
  new_question.save
end  

我假设模型问题包含一个部分外键,而问题包含一个答案外键