通过关联为许多人创建控制器动作

时间:2019-12-06 11:41:52

标签: ruby-on-rails postgresql

我有两个控制器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

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

2 个答案:

答案 0 :(得分:0)

@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

答案 1 :(得分:0)

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

<%= 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