ruby-on-rails - 使用 find_or_create 进行 Rails 事务

标签 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

最佳答案

如果事务回滚,事务中完成的所有操作都会被还原。 (嗯,几乎所有事情,都有一些特定于供应商的陷阱)

对于 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/

相关文章:

ruby-on-rails - gem:从拉取请求中集成更改

ruby-on-rails - Ruby on Rails : Custom Devise Registration Controller, 请求创建操作

javascript - 使用 simple_form 基于单选选择隐藏/显示字段

sql - 两列上的 Ruby Rails Active Record 查询

javascript - 单击 Rails 时显示原始照片

ruby-on-rails - 渲染部分:object vs :locals

ruby-on-rails-4 - ruby 轨道 : Getting Params from URL

sql - 多表发票SUM比较

ruby-on-rails-4 - ActiveModel::Serializer 定义 attribute 属性?

ruby-on-rails - rails 4/Bootstrap 3 : how to display a different navigation bar on different pages?