我正在使用Rails中的测验应用程序来跟踪一些事实
应用程序/模型/ fact.rb
class Fact < ActiveRecord::Base
validates(:question, presence: true, uniqueness: { case_sensitive: false })
validates(:answer, presence: true)
end
每次用户参加新测验时,他们都会生成考试
应用程序/模型/ exam.rb
class Exam < ActiveRecord::Base
after_create :assign_facts
belongs_to :user
default_scope -> { order('created_at DESC') }
validates :user_id, presence: true
has_many :problems
has_many :facts, through: :problems
def assigned?(fact)
problems.find_by(fact_id: fact.id)
end
def assign!(fact)
problems.create!(fact_id: fact.id)
end
private
def assign_facts
facts = Fact.all.sample(10)
facts.each do |fact|
self.assign!(fact)
end
end
end
由于许多考试都使用相同的事实,因此每次考试has_many
事实though
问题
应用程序/模型/ problem.rb:
class Problem < ActiveRecord::Base
belongs_to :exam
belongs_to :fact
validates :exam_id, presence: true
validates :fact_id, presence: true
end
摘自db / scheme.rb:
create_table "problems", force: true do |t|
t.integer "exam_id"
t.integer "fact_id"
t.datetime "created_at"
t.datetime "updated_at"
t.boolean "correct", default: false
end
我的问题是我正在试图找出如何存储每个用户考试的结果(他们是否正确或错误地回答了特定问题)。每当用户回答问题并将结果存储在t.boolean "correct"
列中时,我就计划更新关联表。这在PHP / MySQL(UPDATE problems SET correct = 1 WHERE exam = 'id' AND fact = 'id'
)中是一个相当简单的问题,但我很难弄清楚如何以Rails的方式来实现它。
有没有什么方法可以简单地使用Rails轻松更新我的关联表(问题)? OR 我应该创建第四个表(可能是“结果”或其他内容)来跟踪用户的正确/错误答案吗? - 我知道我这里没有任何控制器代码,我只是在考虑广泛的笔触,我想保持简单。任何帮助将不胜感激。
答案 0 :(得分:1)
你几乎就在那里......你已经在correct
模型的模式中添加了一个名为problem
的布尔列,所以现在你只需要在更新{{{}}时将其作为属性进行访问{1}}。在控制器代码中的某处,你会说:
Exam
如果您使用的是Rails3,则必须在模型中将ps=@exam_taken.problems
ps.each do |p|
if answered_correctly(p)
p.correct=true
p.save
end
end
# This assumes you have a method that checks correctness inside the binding where the
# above code is written
@exam_taken.save
属性声明为correct
。
这是一个免费的专业提示:Default scope is evil:)