如何在单个事务中创建父记录后创建子记录(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
我需要在单个事务中创建一个用户和一个员工,我找不到合适的方法。
这是模型。
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