Как обрабатывать рельсовые соединения с удалением связей таблиц? - PullRequest
0 голосов
/ 16 сентября 2018

Я создаю приложение, которое управляет пользователями и задачами. Соотношение между этими двумя моделями много-много, поскольку пользователю может быть назначено много задач, а задаче может быть назначено много пользователей. По этой причине я создал миграцию 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

1 Ответ

0 голосов
/ 16 сентября 2018

Rails предоставляет возможность управлять :has_many записями через родительскую запись.

Например, вы можете разрешить Пользователю принимать значение_пользователя_t_tributes_for: user_tasks с параметром allow_destroy: true.

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

После такой конфигурацииВы можете добавлять / уничтожать вложенные атрибуты с помощью пользовательской записи update action.

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
  ]
}

Но я бы создал отдельный контроллер для пользовательских задач

Read документы для получения дополнительной информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...