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

时间:2015-04-23 20:22:17

标签: ruby-on-rails json postgresql rails-activerecord

让我们说我有这种json。

在rails中,我有三种型号:

部分有很多问题

问题有一个答案

在数据库中保存/更新它的正确方法是什么?

提前感谢您提供任何帮助

{
"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
}
]
}

2 个答案:

答案 0 :(得分:0)

假设您的示例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

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

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修改的属性。

答案 1 :(得分:0)

首先,您需要以散列ruby格式强制转换json:

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  

我原以为模型问题包含一个部分外键,而Question包含一个anwser外键