如何处理Rails加入表关系删除?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何处理Rails加入表关系删除?相关的知识,希望对你有一定的参考价值。

我正在创建一个管理用户和任务的应用程序。这两个模型之间的关系是多对多关系,因为用户可以分配许多任务,并且任务可以分配许多用户。出于这个原因,我创建了一个UserTasks迁移和模型作为连接表。展望未来,我意识到我希望我的前端功能能够让用户能够从给定任务中分配和删除用户。由于我正在使用JS前端,并向我的rails服务器控制器发送AJAX请求,因此我不清楚如何处理此功能。我不想从数据库中删除用户或任务,而仅仅是关系。可以为我的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
答案

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

例如,您可以允许User使用allow_destroy:true选项来accept_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了解更多信息。

以上是关于如何处理Rails加入表关系删除?的主要内容,如果未能解决你的问题,请参考以下文章

如何处理列名('hash')与 Rails 冲突的旧数据库表?

如何处理突然删除 USB 卷?

如何处理活动流中已删除的照片

关于颠覆,我应该如何处理供应商目录?

使用模态确认删除时表的id值为null时如何处理错误?

如何处理 SQL 代理作业错误?