首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rails 3事务,回滚所有内容

Rails 3事务,回滚所有内容
EN

Stack Overflow用户
提问于 2011-06-13 11:41:03
回答 1查看 6.4K关注 0票数 2
代码语言:javascript
复制
class Bear < ActiveRecord::Base
    def feed!
      self.transaction do
          raise Exception unless self.foods_eaten << Food.new(:name => "fish")
          self.fed_at = Time.now
          save!
       end
    end
end

class Hippo < ActiveRecord::Base
    def wash!
        self.transaction do
            @soap.inventory -= 1
            @soap.save!
            self.washed_at = Time.now
            save!
        end
    end
end

class ZookeeperController < ApplicationController

    def chores
        @zookeeper = Zookeeper.find(params[:id])
        Animal.transaction do
            begin
                @hippo.wash!
                @bear.feed!    # => FAIL AT THIS LINE
                @zookeeper.finished_at = Time.now
                @zookeeper.save!
                redirect_to chores_completed_path
            rescue Exception => e
                 render "new_chores"
            end
        end
    end
end

如果Zookeeper#chores被调用,@bear.feed!失败并引发异常,那么一切都会回滚吗?

关于如何改进此代码的任何其他建议也是受欢迎的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-06-13 16:54:12

看起来我要做的是手动引发一个ActiveRecord::Rollback,否则它不会像预期的那样工作。Rollback是唯一一个不会导致屏幕转储的应用程序。http://api.rubyonrails.org/classes/ActiveRecord/Rollback.html

它会像这样工作是有道理的,但并不是我直观地认为它会工作。如果我说错了,请纠正我。

因此,新代码将如下所示:

代码语言:javascript
复制
class ZookeeperController < ApplicationController

    def chores
        @zookeeper = Zookeeper.find(params[:id])
        Animal.transaction do
            begin
                @hippo.wash!
                @bear.feed!    # => FAIL AT THIS LINE
                @zookeeper.finished_at = Time.now
                @zookeeper.save!
                redirect_to chores_completed_path
            rescue Exception => e
                 @_errors = true
                 render "new_chores"
            end
            raise ActiveRecord::Rollback if @_errors
        end
    end
end
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6326451

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档