Rails 3 ActiveRecord Транзакции - PullRequest
       15

Rails 3 ActiveRecord Транзакции

5 голосов
/ 06 апреля 2011

У меня есть модельный метод, который я хотел бы вызвать с различных контроллеров.Это выглядит примерно так:

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!, произойдет ли откат при каких-либо ошибках?

1 Ответ

21 голосов
/ 06 апреля 2011

В текущей настройке, если 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

Используя транзакции, вы можете быть уверены, что либо все ваши вызовы базы данных (в пределах блока транзакции) будут сохранены в базе данных, либо ни одного вообще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...