Rails 3 ActiveRecord 事务

发布于 2024-10-30 19:06:06 字数 307 浏览 1 评论 0原文

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

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

在我的控制器中,如果我调用 @post.read!,这会在出现任何错误时回滚吗?

I have a model method that I'd like to call from various controllers. It looks something like this:

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

In my controller, if I call @post.read!, will this rollback on any errors?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

陌上芳菲 2024-11-06 19:06:06

在您当前的设置中,如果 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

通过使用事务,你可以放心您的所有数据库调用(在事务块内)将被持久化到数据库,或者根本不会。

In your current setup, if read_at gives an error, it will still continue onto the code that executes thread.status for example.

You want to use ActiveRecord transactions:

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

By using transactions, you can be assured that either all your database calls(within the transaction block) will be persisted to the database, or none at all.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文