如何处理Rails联接表关系删除?

时间:2018-09-15 21:20:20

标签: ruby-on-rails ruby activerecord routes applicationcontroller

我正在创建一个管理用户和任务的应用程序。这两个模型之间的关系是多对多的,因为一个用户可以分配许多任务,而一个任务可以分配许多用户。因此,我创建了一个UserTasks迁移和模型以用作联接表。展望未来,我意识到我希望前端功能能够使用户能够从给定任务中分配和删除用户。由于我正在使用JS前端,并将AJAX请求发送到我的rails服务器控制器,因此我不清楚如何处理此功能。我不想从数据库中删除用户或任务,而只是删除关系。是否可以为我的UserTask模型制作一个API控制器,并以#destroy方法处理此逻辑? Rails提供了一种更自动化的方法吗?

这是我的模型的样子:

用户

class User < ApplicationRecord
  VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-]+(\.[a-z\d\-]+)*\.[a-z]+\z/i

  after_initialize :ensure_session_token

  validate :valid_email

  validates :name, :email, :password_digest, :session_token, presence: true
  validates :email, :session_token, uniqueness: true
  validates :password, length: { minimum: 6, allow_nil: true }

  has_many :user_tasks,
  foreign_key: :user_id,
  class_name: "UserTask"

  has_many :tasks,
  through: :user_tasks,
  source: :task

  ...misc code
end

任务

class Task < ApplicationRecord
  validates :name, presence: true

  has_many :user_tasks,
  foreign_key: :task_id,
  class_name: "UserTask"

  has_many :assignees,
  through: :user_tasks,
  source: :user

  has_many :sub_tasks,
  foreign_key: :parent_task_id,
  class_name: "Task"
end

UserTask

class UserTask < ApplicationRecord
  validates :user_id, :task_id, presence: true

  belongs_to :user,
  foreign_key: :user_id,
  class_name: "User"

  belongs_to :task,
  foreign_key: :task_id,
  class_name: "Task"
end

当前路线

Rails.application.routes.draw do
  root to: 'static_pages#root'

  namespace :api, defaults: { format: 'json' } do
    resources :users, only: [:create, :update, :show]
    resources :tasks, only: [:create, :index, :show, :update, :destroy]
    resources :projects, only: [:create, :index, :show, :update, :destroy]
    resource :session, only: [:create, :destroy]
  end
end

1 个答案:

答案 0 :(得分:0)

Rails提供了通过父记录管理:has_many记录的功能。

例如,您可以允许用户使用allow_destroy:true选项接受accepts_nested_attributes_for:user_tasks。

class User < ActiveRecord::Base
  accepts_nested_attributes_for : user_tasks, allow_destroy: true
end

完成此配置后,您可以通过用户记录update操作添加/删除嵌套属性。

params = {
  id: 'user_id', user_tasks_attributes: [
    { user_id: 'user_id', task_id: 'task_id' }, #this will create new join record
    { id: 'user_task_id', _destroy: '1' } #this will destroy join record
  ]
}

但是我要为UserTasks创建一个单独控制器

阅读docs了解更多信息。