rails объект в спасении после сбоя транзакции - PullRequest
3 голосов
/ 21 февраля 2010

У меня есть транзакция, чтобы две модели были сохранены одновременно.

begin 
  Recipe.transaction do
    @recipe.save!
    if @dish
      @dish.save!
    end
  end
rescue

  #save failed
  flash[:notice] = "recipe.saved = #{@recipe.new_record?}"
  render 'form'
else
  #save worked
  flash[:notice] = 'Recipe added.'
  redirect_to(@recipe)
end

при сбое проверки для одной из моделей она отправляется в блок восстановления, однако в блоке восстановления говорится, что модель не является новой записью. я ожидал, что проверка приведет к сбою транзакции, оставив объект модели в качестве новой записи? что мне здесь не хватает?

Ответы [ 3 ]

5 голосов
/ 21 февраля 2010

Что из двух сохранений на самом деле терпит неудачу? Один для @recipe или для @dish?

Транзакции обрабатываются вашей СУБД. Так, например, когда @dish не удается сохранить, @recipe, возможно, уже был сохранен, но будет отменен вашей СУБД. Однако это происходит за спиной Rails и поэтому не возвращает состояние объекта @recipe.

4 голосов
/ 28 ноября 2010

Из документации по Rails:

Исключения вызовут откат, который возвращает базу данных в состояние до начала сделки. Быть осознавая, однако, что объекты будут не возвращаются данные экземпляра до предтранзакционного состояния.

http://api.rubyonrails.org/classes/ActiveRecord/Transactions/ClassMethods.html

0 голосов
/ 26 июня 2010

Я вполне уверен, что самая внешняя транзакция будет применяться ко всему внутри нее - поэтому в этом случае, если сохранение блюда не удалось, создание рецепта также будет отменено.

Может быть, вы не используете таблицы InnoDB? MyISAM не поддерживает транзакции.

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