В текущей настройке, если 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
Используя транзакции, вы можете быть уверены, что либо все ваши вызовы базы данных (в пределах блока транзакции) будут сохранены в базе данных, либо ни одного вообще.