Ruby on rails Rails-节约成本的最佳方式;“给出答案”;在数据库中?

Ruby on rails Rails-节约成本的最佳方式;“给出答案”;在数据库中?,ruby-on-rails,ruby,rails-migrations,ruby-on-rails-5,Ruby On Rails,Ruby,Rails Migrations,Ruby On Rails 5,我正在用RubyonRails制作一个测验应用程序,我有一个模型“答案”。现在,我需要将用户对问题的回答保存到数据库中,因此我想我将制作一个模型“GivenAnswer”,并将控制器与这些现有模型作为属性进行匹配: “用户” “问题” “答复” 我将把分析给定答案的所有逻辑放入“GivenAnswers”控制器,但不确定db迁移应该是什么样子。另外,我希望有关于“用户”和“问题”的索引,因为我将经常显示“每个用户的答案”和“每个问题的答案”。我生成了这个迁移: class CreateGiv

我正在用RubyonRails制作一个测验应用程序,我有一个模型“答案”。现在,我需要将用户对问题的回答保存到数据库中,因此我想我将制作一个模型“GivenAnswer”,并将控制器与这些现有模型作为属性进行匹配:

  • “用户”

  • “问题”

  • “答复”

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

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
但我想知道表是否应该是纯关系的:

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
class CreateGivenAnswers

我是一名Rails初学者,因此我非常感谢您的指点。

属于
引用的别名
,所以您使用哪一个都没有区别

在这种情况下,不要删除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
class CreateGivenAnswers

但是我认为你不应该把
答案
直接与
给予者力量
联系起来。将
答案
问题

联系起来会更有意义,因为你的问题是关于db迁移的,最好添加标签
rails迁移
,如果你正在使用
rails5
也添加
ruby-on-rails-5
谢谢你的提示:)@ImranThank you@Toby,这很有意义<代码>答案
问题
相关,具有*对1的关系。你为什么说我不应该把
答案
GivenAnswer
联系起来?你是说一个问题有多个答案,还是一个答案有多个问题?如果
Answer
Question
相关,并且
Question
givenaswer
相关,则
givenaswer
可以通过
Question
访问
答案。如果它还被直接引用到
答案
,那么在数据库级别上可能会出现不一致的情况。例如,如果某个问题的答案发生了更改,但与该问题的给定答案链接的答案没有更改,该怎么办?因此,现在问题A的正确答案变成了X,但问题A的给定答案对象表示正确答案仍然是Y。应该不惜一切代价避免数据库级别的不一致,因为从长远来看,它们将使应用程序不可维护。我明白你的观点@Toby。在我的应用程序中,每个问题都有多个答案(选择题型测验),但每个答案只属于一个问题。所以为了避免不一致,我最初考虑只将User和Answer作为属性包含在givenaswer表中。但由于我将展示大量按问题索引的给定答案,我认为将问题列也包括在内会更简单,只要我确保在保存新的GivenAswer记录之前,问题列中的问题和链接到答案对象的问题是相同的。至于保存给定问题的答案后的一致性:这是一个好观点,我还没有考虑过这一点。我仍然希望GivenAnswer引用旧答案对象(因为这是用户选择的对象),但可以使用某种软删除,因此当测验作者更改某些内容时,答案控制器不会覆盖旧答案,而是创建新记录并将旧记录标记为已删除(但仍可通过GivenAnswer表访问)。