【问题标题】:Rails - Best way to save "Given Answer" in database?Rails - 在数据库中保存“给定答案”的最佳方式?
【发布时间】:2017-09-03 10:59:54
【问题描述】:

我正在使用 Ruby on Rails 制作一个测验应用程序,其中有一个模型“Answer”。现在我需要将用户给出的问题的答案保存到数据库中,所以我想我会制作一个模型“GivenAnswer”并将这些现有模型作为属性匹配控制器:

  • “用户”

  • “问题”

  • “答案”

我将把分析给定答案的所有逻辑放入“GivenAnswers”控制器中,但我不确定数据库迁移应该是什么样子。另外,我想在“用户”和“问题”上有索引,因为我要经常显示“每个用户的答案”和“每个问题的答案”。我生成了这个迁移:

class CreateGivenAnswers < ActiveRecord::Migration[5.0]
  def change
    create_table :given_answers do |t|
      t.references :user, foreign_key: true
      t.references :question, foreign_key: true
      t.references :answer, foreign_key: true

      t.timestamps
    end
  end
end

但我想知道该表是否应该是纯粹的关系:

class CreateGivenAnswers < ActiveRecord::Migration[5.0]
  def change
    create_table :given_answers, id:false do |t|
      t.belongs_to :user, index: true
      t.belongs_to :question, index: true
      t.belongs_to :answer
    end
  end
end

我是 Rails 初学者,所以我会感谢任何指点。

【问题讨论】:

  • 因为你的问题是关于数据库迁移的,最好添加标签rails-migrations,如果你正在使用rails5也添加ruby-on-rails-5
  • 感谢您的提示 :) @Imran

标签: ruby-on-rails ruby rails-migrations ruby-on-rails-5


【解决方案1】:

belongs_toreferences 的别名,因此您使用哪个没有区别。

在这种情况下不要删除 id 列。

任何外键也应该是索引。

我会这样做:

class CreateGivenAnswers < ActiveRecord::Migration[5.0]
  def change
    create_table :given_answers, id:false do |t|
      t.references :user, index: true, foreign_key: true
      t.references :question, index: true, foreign_key: true
      t.references :answer, index: true, foreign_key: true
    end
  end
end

但我认为您不应该将Answer 直接与GivenAnswer 相关联。将AnswerQuestion 关联起来会更有意义

【讨论】:

  • 谢谢@Toby,这是有道理的。 AnswerQuestion 有 * 到 1 的关系。为什么你说我不应该将AnswerGivenAnswer 联系起来?
  • 您是说一个问题有多个答案还是一个答案有多个问题?如果AnswerQuestion相关,QuestionGivenAnswer相关,则GivenAnswer可以通过Question访问Answer。如果还直接引用Answer,那么它可能会在数据库级别出现不一致。
  • 例如,如果某个问题的答案发生了变化,但与该问题的给定答案相关联的答案没有变化怎么办?所以现在问题 A 的正确答案变成了 X,但问题 A 的给定答案对象说正确答案仍然是 Y。应该不惜一切代价避免数据库级别的不一致,因为它们会使您的应用程序在从长远来看。
  • 我明白你的观点@Toby。在我的应用程序中,每个问题都有多个答案(多项选择题类型测验),但每个答案只属于一个问题。因此,为了避免不一致,我最初考虑只在 GivenAnswer 表中包含 User 和 Answer 作为属性。但是由于我将显示很多由 Question 索引的给定答案,所以我认为包含 Question 列会更简单,只要我确保在保存新的 GivenAnswer 记录之前,Question 列中的 Question 和链接到 Answer 对象的那个是相同的。
  • 至于保存给定问题的答案后的一致性:这是一个好点,我还没有考虑过。我仍然希望 GivenAnswer 引用旧的 Answer 对象(因为那是用户选择的),但可以使用一种软删除,因此当测验作者更改某些内容时,Answer 控制器不会覆盖旧的 Answers,而是生成新记录并将旧记录标记为已删除(但仍可通过 GivenAnswer 表访问)。
猜你喜欢
  • 2022-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-27
  • 1970-01-01
  • 2011-11-18
  • 2011-12-02
相关资源
最近更新 更多