@eldar_web

Как в Ruby on Rails сделать откаты добавления при неудачном случае у его связанных?

Например, есть модели Subscriber и Address и они взаимосвязаны, то есть, сперва добавляется Subscriber, а потом Address с сохранением id Subscriber-a.
То есть примерно так, в контроллере:
def create
subs = Subscriber.create(...)
Address.create(subscriber_id: subs.id...)
end


Вот, иногда может случиться так, что Subscriber может добавляться, а Address нет (например, интернет пропал).
Ведь в данном случае Subscriber будет, а Address нет.
Как же делать так, что если Address не добавился, то созданный Subscriber тоже удалился?
  • Вопрос задан
  • 187 просмотров
Решения вопроса 2
Использовать транзакции.
Ответ написан
Комментировать
@Givandos
верстка, пыха (прощай, родная), рельсы (вы кто?)
Понимаю, что вопрос был задан давно, и возможно ответ уже найден, но тут он не был озвучен, потому...

Ответ fshp правильный, но довольно сложный, учитывая имеющиеся в рельсах альтернативы.
В конкретно указанном автором случае есть более корректный вариант защиты/ролбека.

def create
  subs = Subscriber.new(...)
  subs.address.new()
  subs.save
end


-- UPDATE --
Ошибся с методом создания наследуемых моделей.
Корректно это будет так:
def create
  subs = Subscriber.new(...)
  subs.build_address
  subs.save
end

Либо subs.addresses.build, если адресов у подписчика много (связь has_many)
-- end update --

В данном случае создается экземпляр модели подписчика, дальше создается эксемпляр адреса, принадлежащего модели подписчика, и потом все это пытается сохраниться (записаться в БД). Если что-то идет не так, то save вернет false, при этом сам позаботиться о транзакциях и ролбеках.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы