2016-11-25 49 views
0

我需要在一次交易中创建一个用户和一个员工,我找不到一个正确的方法来做到这一点。如何在单个事务中创建父项之后创建子记录(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 

这里的问题是,如果在创建用户后抛出一个异常,则数据库会出现不一致。 我该如何正确和安全地做到这一点?

嗯,我已经把头撞在这堵砖墙上很久了。任何帮助摆脱这一点,将不胜感激!

在此先感谢!

+0

只是好奇,为什么两种不同的模式供用户和员工,大部分是每个员工都有一个用户名 –

+0

因为用户可以在不雇员,如果雇员存在,它必须有一个用户存在。所以当我创建员工时,必须先创建用户。 –

回答

3

试试这个:

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 
+0

非常感谢你..它工作完美,因为我想。 –

相关问题