在我的 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
?
最佳答案
如果事务回滚,事务中完成的所有操作都会被还原。 (嗯,几乎所有事情,都有一些特定于供应商的陷阱)
对于 find_or_create
也是如此,只要它在事务期间被调用。回滚后,创建的对象仍在内存中,但支持数据库行不再存在。
因此,只要您的代码如下所示,您就应该是安全的:
Booking.transaction do
@guest = Guest.find_or_create_by(:email => params[:email])
@booking.save!
@guest.save!
end
关于ruby-on-rails - 使用 find_or_create 进行 Rails 事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19332842/