You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 04:27:16