Rails 3 ActiveRecord交易

Dex*_*Dex 5 activerecord transactions ruby-on-rails

我有一个模型方法,我想从各种控制器调用.它看起来像这样:

def Post < ActiveRecord::Base
    def read!
      self.read_at = Time.now
      self.save
      self.thread.status = Status.find_by_name("read")
      self.thread.save
    end
end
Run Code Online (Sandbox Code Playgroud)

在我的控制器中,如果我打电话@post.read!,这会回滚任何错误吗?

Mik*_*wis 21

在当前设置中,如果read_at发出错误,它仍将继续执行thread.status例如执行的代码.

您想使用ActiveRecord事务:

def read!
  transaction do
    self.read_at = Time.now
    self.save
    self.thread.status = Status.find_by_name("read")
    self.thread.save
  end
end
Run Code Online (Sandbox Code Playgroud)

通过使用事务,可以确保所有数据库调用(在事务块中)都将持久保存到数据库,或者根本不存在.

  • 不会"保存!"比"保存"更好吗?我认为,如果第二个`save`失败,则不会抛出任何异常,因此事务不会回滚,并且线程和帖子最终会彼此不同步. (10认同)
  • `transaction`也被定义为`ActiveRecord`类中的实例方法,因此你也可以直接调用它(不带前缀`ActiveRecord :: Base`). (3认同)