在我的 Rails 4 应用程序中,我有一个表单,可以将数据提交给两个不同的模型booking.rb
和guest.rb
. 每个模型都必须验证它们各自的数据,并且只有当两者都有效时,脚本的其余部分才能继续。
我相信事务是前进的方向,事实上我在同一个应用程序中有另一个场景,我确实使用了事务。
但是,在这种情况下,@guest 实例是使用以下方法生成的:
@guest = Guest.find_or_create_by(:email => params[:email])
当然,如果它不存在,这条线实际上会创建记录。我的理解是,如果实际创建了事务,它不会回滚?理想情况下,我需要的是:
@guest = Guest.find_or_new(:email => params[:email])
但我不认为这是 Rails 中的一个选项?
如果出现验证错误,我可以继续执行事务并回滚:
begin
@booking.transaction do
@booking.save!
@guest.save!
end
redirect_to somewhere
rescue
render :new
end
我的问题如何使用事务验证这两个模型,同时还要考虑到find_or_create_by
?