Ruby on 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

我有一个Rails应用程序,它有
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
我使用
,因为只有发生异常时,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
部分,否则将成功返回。