如何在单个事务中创建父记录后创建子记录(Rails 5)?

How to create a child record after create the parent in a single transaction (Rails 5)?

我需要在单个事务中创建一个用户和一个员工,我找不到合适的方法。

这是模型。

class User < ApplicationRecord
  has_one :employee
end

class Employee < ApplicationRecord
  belongs_to :user
end

在控制器中,我从创建两个模型的请求中接收参数。

{
    "username": "my_user",
    "password": "12345",
    "employee": {
        "name: "my_name",
        "lastname": "my_lastname"
    }
}

所以我想做这样的事情。

class UsersController < ResourcesController
    def create
        user = User.create! do |u|
           u.username = params.username
           u.password = params.password
        end
        employee = Employee.create! do |e|
           e.name = params.name
           e.lastname = params.lastname
           e.user_id = user.id
        end
    end
end

这里的问题是,如果创建用户后抛出异常,那么数据库就会不一致。 我怎样才能正确和安全地做到这一点?

好吧,我的头撞在这堵砖墙上已经有一段时间了。任何有助于阐明这一点的帮助将不胜感激!

提前致谢!

试试这个:

class User < ApplicationRecord
  has_one :employee inverse_of :user
  accepts_nested_attributes_for :employee
end

class Employee < ApplicationRecord
  belongs_to :user inverse_of :employee
  validates_presence_of :user
end

class UsersController < ResourcesController
  def create
    @user = User.new(user_params)
    @user.save!
  end

  private

  def user_params
    params.require(:user).permit(:name, :password, employee_attributes: [:name,:last_name])
  end
end