Rails一对一更新,一对多更新 - 如果不存在则创建子对象

时间:2015-10-08 14:09:43

标签: ruby-on-rails ruby controller

我有三个模型:EmployeeUserRole。这些类之间的关系为employee --- one_to_one - useruser - one_to_many - role

我的创建操作可以正常使用以下强大的params方法

def employee_params
  params.require(:employee).permit(:first_name, :middle_name, :last_name, :email, user_attributes: [:id, role_ids:[]])
end

对于员工记录没有用户对象的更新,我实例化新用户,将其映射到员工并通过传递字符串参数调用更新。但是,更新失败并显示消息:

  

无法保存新的关联用户

我的更新方法代码是

def update
  @employee = Employee.find(params[:id])
  if params[:employee][:user_attributes] != nil && params[:employee][:user_attributes][:role_ids] != nil && ! params[:employee][:user_attributes][:role_ids].empty?
    if @employee.user == nil
      @employee.user = User.new
      temp_password = Devise.friendly_token.first(8)
      @employee.user.is_temp_password = true
      @employee.user.password = Devise.friendly_token.first(8)
      @employee.user.email = @employee.email
      @employee.user.email = params[:employee][:email] if  params[:employee][:email]
    end
  end
  respond_to do |format|
    if @employee.update(employee_params)
      format.json { render json: @employee.as_json}
    else
      format.json {render :json => @employee.errors.as_json, :status => 422}
    end
  end
end

1 个答案:

答案 0 :(得分:0)

我认为,正如上面的用户建议的那样,你需要保存新的用户对象,但我认为你应该在Employee创建中有用户创建代码,因为你需要在更新中自动创建它

不确定你是否也知道助手空白?,现在?但我用那个

重写了你的代码
def update
  @employee = Employee.find(params[:id])
  if params[:employee][:user_attributes].present? && params[:employee][:user_attributes][:role_ids].present? && params[:employee][:user_attributes][:role_ids].present?    
    unless @employee.user
      user = User.new
      @employee.user = user
      temp_password = Devise.friendly_token.first(8)
      user.is_temp_password = true
      user.password = Devise.friendly_token.first(8)
      user.email = @employee.email
      user.email = params[:employee][:email] if  params[:employee][:email]
      user.save!
    end
  end