我正在创建一个管理用户和任务的应用程序。这两个模型之间的关系是多对多的,因为一个用户可以分配许多任务,而一个任务可以分配许多用户。因此,我创建了一个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
答案 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了解更多信息。