通过关联为多对多创建控制器操作



我有两个控制器,一个EmployeesController和一个TasksController。我已经通过关联设置了多对多,并创建了一个 EmployeeTasksController 来处理这种关系 这是我添加到routes.rb的内容

### ASSIGING EMPLOYEES TO TASKS ###
resources :tasks do
resources :employees, controller: 'employee_tasks'
end

然后控制器:

class EmployeeTasksController < ApplicationController
def create
@task=Task.find(params[:task_id])
@employee=@task.employees.create(employee_params)
if @employee.save
render json: @employee, status: :created, employee: @employee
else
render json: @employee.errors, status: :unprocessable_entity
end
end
def employee_params
params.require(:employee).permit(:name,:email,:deleted_at)
end

schema.rb 具有:

create_table "employee_tasks", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
t.uuid "employee_id", null: false
t.uuid "task_id", null: false
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.index ["task_id"], name: "index_employee_tasks_on_task_id"
t.index ["employee_id"], name: "index_employee_tasks_on_employee_id"
end

我也有

class Employee < ApplicationRecord
has_many :employee_tasks
has_many :tasks, through: :employee_tasks
end
class Task < ApplicationRecord
has_many :employee_tasks
has_many :employees, through: :employee_tasks
end
class EmployeeTask < ApplicationRecord
belongs_to :employee
belongs_to :task
end

现在我的问题是:我是否正确实现了创建方法?我应该能够为一个任务分配一个或多个用户吗?

@RubyBox模型中是否有以下关联。

Task.rb

class Task < ApplicationRecord
has_many :employee_tasks
has_many :employees, through: :employee_tasks
end

EmployeeTask.rb如下,

class EmployeeTask < ApplicationRecord
belongs_to :task
belongs_to :employee
end

Employee.rb

class Employee < ApplicationRecord
has_many :employee_tasks
has_many :tasks, through: :employee_tasks
end

通过使用这种create方法,仅当数据库中尚不存在该员工时,您才能将任务分配给多个员工。

执行此操作的最佳方法是在此操作中创建employee_task对象。

def create
@task  = Task.find(params[:task_id])
@employee = Employee.find_or_create_by(employee_params)
@employee_task = EmployeeTask.new(task: @task, employee: @employee)
if  @employee_task.save
#return employee or employee_task  
else
#return employee or employee_task
end
end

如果您只想将用户分配给任务,则可以作为正常任务创建或更新操作的一部分:

<%= form_for(@task) do |f| %>
<%= f.collection_checkboxes :user_ids, User.all, :id, :name %>
# ...
<% end %>
class TasksController
def create
@task = Task.new(task_params)
# ...
end
def update
if @task.update(task_params)
# ...
else
# ...
end
end
private
def task_params
params.require(:task).permit(:user_ids, ...)
end
end

最新更新