2

在我的 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

4

1 回答 1

2

如果事务回滚,则事务中所做的一切都将恢复。(嗯,几乎所有事情,都有一些特定于供应商的陷阱)

find_or_create只要在事务期间调用它也是如此。回滚后,创建的对象仍在内存中,但支持的数据库行不再存在。

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

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

  @booking.save!
  @guest.save!
end
于 2013-10-12T10:09:20.700 回答