在我的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
?
答案 0 :(得分:2)
如果事务被回滚,则会恢复事务中完成的所有操作。 (好吧,差不多了,还有一些供应商特定的陷阱)
find_or_create
也是如此,只要在交易期间将其称为 。回滚后,创建的对象仍在内存中,但后备数据库行不再存在。
只要您的代码看起来像这样,您应该是安全的:
Booking.transaction do
@guest = Guest.find_or_create_by(:email => params[:email])
@booking.save!
@guest.save!
end