Я создаю приложение, которое управляет пользователями и задачами. Соотношение между этими двумя моделями много-много, поскольку пользователю может быть назначено много задач, а задаче может быть назначено много пользователей. По этой причине я создал миграцию UserTasks и модель для использования в качестве таблицы соединений. Заглядывая в будущее, я понял, что хочу, чтобы моя функциональность внешнего интерфейса давала пользователю возможность назначать и удалять пользователей из определенной задачи. Поскольку я использую интерфейс JS и отправляю запросы AJAX на мои контроллеры сервера rails, я не совсем понимаю, как обращаться с этой функциональностью. Я не хочу удалять ни пользователя, ни задачу из базы данных, а просто отношения. Можно ли создать контроллер API для моей модели UserTask и обработать эту логику методом #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