Свертывание save
в транзакции будет недостаточно: если проверка не пройдена, исключение не будет возникать и откат не будет инициирован.
Я могу предложить это:
B.transaction do
a.each do |o|
raise ActiveRecord::Rollback unless o.save
end
end
Простое выполнение B.transaction do a.each(&:save!) end
также не вариант, потому что блок транзакции не спасет никакое исключение, кроме ActiveRecord::Rollback
, и приложение завершится сбоем при неудачной проверке.
Я не знаю, как потом проверить, сохранены ли записи.
Обновление . Поскольку кто-то понизил мой ответ, я предполагаю, что этот человек искал решение «вырезать и вставить» :), так что вот какой-то (уродливый :)) способ обработки значения сбой / успех:
save_failed = nil
B.transaction do
a.each do |o|
unless o.save
save_failed = true
raise ActiveRecord::Rollback
end
end
end
if save_failed
# ...
else
# ...
end