Ruby on rails Rails-节约成本的最佳方式;“给出答案”;在数据库中?
我正在用RubyonRails制作一个测验应用程序,我有一个模型“答案”。现在,我需要将用户对问题的回答保存到数据库中,因此我想我将制作一个模型“GivenAnswer”,并将控制器与这些现有模型作为属性进行匹配: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
- “用户”
- “问题”
- “答复”
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表访问)。