使用find_or_create进行Rails事务

时间:2013-10-12 09:49:52

标签: ruby-on-rails ruby-on-rails-4

在我的Rails 4应用中,我有一个表单,可以将数据提交给两个不同的模型booking.rbguest.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

1 个答案:

答案 0 :(得分:2)

如果事务被回滚,则会恢复事务中完成的所有操作。 (好吧,差不多了,还有一些供应商特定的陷阱)

find_or_create也是如此,只要在交易期间将其称为 。回滚后,创建的对象仍在内存中,但后备数据库行不再存在。

只要您的代码看起来像这样,您应该是安全的:

Booking.transaction do
  @guest = Guest.find_or_create_by(:email => params[:email])

  @booking.save!
  @guest.save!
end