В моей модели есть следующий метод:
class Task < ActiveRecord::Base
def update_completed_task(task_params, completed_material_params)
puts 'in update_completed_task method'
transaction do
begin
puts 'inside transaction'
self.task_finished
puts 'after task finished'
self.update_attributes!(task_params)
puts 'after update_attributes'
if completed_material_params
completed_material_params.each do |key, value|
@completed_material = CompletedMaterial.where("identity = ?", value).first
@completed_material.task = self
@completed_material.save
end
end
puts 'affter loop'
UserNotification.freelancer_has_submitted_documents(self.schedule.project, self)
puts 'after user notification change'
rescue
puts 'in rescue again yolo gandi rollback'
end
end
end
end
Я новичок в транзакциях в рельсах, но я понимал, что если одно из взаимодействий с базой данных не удастся, вся транзакция будет отменена. В приведенном выше коде строка:
self.update_attributes(task_params)
происходит сбой, поэтому обновление базы данных, которое происходит из self.task_finished в предыдущей строке, следует откатить. Почему-то не откатывается.
Для справочной информации, хотя я не думаю, что это должно иметь значение, строка "self.task_finished" использует гем state_machine для изменения состояния задачи. Однако он все равно должен откатиться. Что не так с моей транзакцией
update_attributes!
. Это вызовет исключение, запустив откат. - person Stefan   schedule 04.04.2014