2016-11-25 3 views
0

단일 트랜잭션에서 User와 Employee를 생성해야하는데, 적절한 방법을 찾을 수 없습니다.단일 트랜잭션 (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

대단히 감사합니다. 내가 원했던 것처럼 완벽하게 작동합니다. –