AR-транзакция не работает должным образом. Первая запись сохраняется, вторая нет, но первая запись не уничтожается - PullRequest
0 голосов
/ 01 июля 2018

Я пытаюсь использовать транзакции AR, чтобы убедиться, что обе записи или ни одна не создана. У меня есть фотомодель и модель Post, которая делает фотографию. Я хочу либо создать оба, либо ни одного. Мой код выглядит так:

class Post < ActiveRecord::Base
  validates :photo, :body, presence: true

  def self.create_from_upload(photo: nil, body: nil)
    self.transaction do
      photo = Photo.create(photo: photo)
      post = Post.create(photo: photo, body: body)
    end
    post
  end
end

Здесь фотография представляет собой загруженный файл из формы, а тело представляет собой строку. Если передается фотография, но не строка тела, создается фотография, а публикация - нет, но транзакция не уничтожает фотографию

Почему транзакция не удаляет запись фотографии?

1 Ответ

0 голосов
/ 01 июля 2018

create не вызывает исключения. Это означает, что блок transaction завершается нормально и, таким образом, фиксирует свои изменения (исключая те, из-за которых второй create внутренне отказался - но те не отменяют окружающую транзакцию).

Самый простой способ сделать так, как вы ожидаете, - это использовать create!, который повысится, если не удастся создать и сохранить запись.

Кроме того, вы можете проверить состояния объектов после create в конце блока transaction и явно вызвать там исключение.

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