让我们说我有这种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
}
]
}
答案 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外键