Rails开发:如何将MC_question表answer字段数据同步到关联模型
Rails 答题记录表自动填充标准答案实现方案
前置修复:补全必要外键
你当前的user_r_mc_questions表缺少关联多选题的外键字段,无法匹配对应题目的标准答案,先执行以下操作补全:
- 终端执行命令生成迁移文件:
rails g migration AddForeignKeysToUserRMcQuestions
- 编辑生成的迁移文件,补充外键并修正不符合Rails命名规范的字段:
class AddForeignKeysToUserRMcQuestions < ActiveRecord::Migration[6.1] def change # 补多选题关联外键 add_reference :user_r_mc_questions, :mc_question, foreign_key: true # 将不符合规范的User_ID字段修正为标准user_id外键 rename_column :user_r_mc_questions, :User_ID, :user_id change_column :user_r_mc_questions, :user_id, :bigint add_foreign_key :user_r_mc_questions, :users end end
- 执行迁移生效:
rails db:migrate
配置模型自动填充逻辑
在两个模型中分别配置关联,同时给答题记录表加保存前自动填充答案的回调:
# app/models/mc_question.rb class McQuestion < ApplicationRecord has_many :user_r_mc_questions, dependent: :destroy end
# app/models/user_r_mc_question.rb class UserRMcQuestion < ApplicationRecord belongs_to :user belongs_to :mc_question # 创建记录前自动填充对应题目的标准答案 before_create :fill_correct_answer private def fill_correct_answer self.answer = mc_question.answer end end
配置生效后,所有新创建的答题记录只要绑定了对应题目,保存时会自动匹配填充标准答案,无需手动赋值。
批量补全已有历史数据
如果已经存在未填充answer的历史记录,进入Rails控制台执行批量更新即可:
rails c
在控制台输入执行以下代码:
UserRMcQuestion.includes(:mc_question).find_each do |record| record.update_column(:answer, record.mc_question.answer) end
优化建议:不建议在答题记录表冗余存储标准答案字段,后续题目答案修改时需要同步更新所有关联答题记录,维护成本很高。日常使用直接通过关联调用即可:
record.mc_question.answer,完全不需要单独存一份。如果确实需要冗余存储,建议额外给McQuestion加after_update回调,答案变更时自动同步更新所有关联答题记录的answer值。
内容的提问来源于stack exchange,提问作者Abu Bakar
相关产品推荐
相关产品推荐

