Ruby on rails 同时更新两个实例变量
我有一个Rails应用程序,它有Ruby on rails 同时更新两个实例变量,ruby-on-rails,Ruby On Rails,我有一个Rails应用程序,它有User.rb、Question.rb和Answer.rb模型。每个模型之间都定义了可预测的关系。用户有很多问题,用户也有很多答案。一个问题也有很多答案 我试图让提问者选择一个答案作为“最佳答案””。因此,我在Answers控制器中创建了一个“bestAnswer”控制器操作。在此控制器操作中,我希望将最佳答案的id存储在@question中,并指出特定的@answer被选为最佳答案。因此,我试图同时更新@问题和@答案的属性 if @question.update
User.rb
、Question.rb
和Answer.rb
模型。每个模型之间都定义了可预测的关系。用户有很多问题,用户也有很多答案。一个问题也有很多答案
我试图让提问者选择一个答案作为“最佳答案”
”。因此,我在Answers控制器中创建了一个“bestAnswer”控制器操作。在此控制器操作中,我希望将最佳答案的id存储在@question
中,并指出特定的@answer
被选为最佳答案。因此,我试图同时更新@问题
和@答案
的属性
if @question.update_attributes(:accepted_answer_id => @answer.id) && @answer.update_attributes(:accepted => true)
完整方法
def bestanswer
@answer = Answer.find(params[:answer_id])
@question = Question.find(params[:question_id])
if @question.update_attributes(:accepted_answer_id => @answer.id) && @answer.update_attributes(:accepted => true)
redirect_to @question, notice: 'You have accepted as best answer'
else
redirect_to @question, notice: 'There was a problem marking this as best answer. Please try again.'
end
end
这是可行的,但我也知道Rails支持事务。由于缺乏经验,我不确定我是否应该像上面那样做,或者尝试做交易,或者做其他事情。如果你认为我应该做一笔交易,你会怎么写?我有点困惑,因为我认为事务应该在模型上完成,我不确定是否在模型中使用实例变量等,以及在哪个模型上编写它
更新。我在第一个答案中以以下方式实施了该建议。这很管用,但我觉得很奇怪。由于我的OP询问如何编写事务,我希望有人能澄清如何将事务集成到控制器操作中
if ActiveRecord::Base.transaction do
@question.update_attributes! :accepted_answer_id => @answer.id
@answer.update_attributes! :accepted => true
end
redirect_to @question, notice: 'You have accepted as best answer'
else
redirect_to @question, notice: 'There was a problem marking this as best answer. Please try again.'
end
你能行
ActiveRecord::Base.transaction do
@question.update_attributes! :accepted_answer_id => @answer.id
@answer.update_attributes! :accepted => true
end
我使用这里是code>,因为只有发生异常时,ActiveRecord才会回滚事务,如果出现问题,将触发代码>更新属性版本
此外,如果您在问题模型上建立了一个has\u one:accepted\u response
关系,您应该使用
@question.update_attributes! :accepted_answer => @answer
不要手动设置ID。一般来说,最好让ActiveRecord管理ID。谢谢,但您能提供更多信息吗。我是否将该事务直接放入bestanswer操作中?如果是这样,如何编写成功保存或失败保存的重定向?另外,我喜欢has_one的想法:接受答案,但是我需要在答案模型中添加更多的东西来让它工作吗?我已经做了:关于答案模型的问题。如果你能帮忙,谢谢你。我有点经验不足,所以您能提供的任何细节都将不胜感激。我让事务按照OP更新中所示的方式工作,但我实现它的方式看起来真的很奇怪。你会这样做吗?我真的只是通过看到其他人编写代码来学习,我以前从未见过使用这些代码中的任何一个……我不确定Rails是否会从事务中返回false
。如果是这样,那么我可能会将结果存储在一个变量中,然后在该变量上使用If
,而不是在整个事务方法上使用If
。您还可以从ActiveRecord::Rollback
中进行解救,每当触发回滚时就会抛出该命令。因此,如果捕获到该异常,可以运行if语句的else
部分,否则将成功返回。