Rails создают несколько записей на основе пользовательского ввода - PullRequest
0 голосов
/ 23 декабря 2018

У меня есть приложение проектов, которое позволяет всем Пользователям в группе создавать Задачи. Я бы хотел, чтобы Пользователь мог добавлять пользователей в Задачу (например, если на совещании присутствовало несколько человек).По сути, в новой форме задачи будут указаны все имена пользователей в команде, и пользователь может установить флажок под каждым именем для всех, кто участвовал в этой задаче.

Изначально я думал, что лучший способ сделать этомогут быть отношения has_many through:, где у меня было:

Задачи:

class Task < ApplicationRecord
    has_many :user_tasks
    has_many :users, through: :user_tasks

Пользователи:

class User < ApplicationRecord

 has_many :user_tasks
 has_many :tasks, through: :user_tasks

И User_Tasks:

class UserTask < ApplicationRecord
  belongs_to :user
  belongs_to :task
end

Идея заключалась в том, что при создании новой задачи любой user_ids, помеченный в задаче, будет создавать новые записи в User_Tasks.Но я не уверен на 100%, как это сделать в задаче создать действие, и я начинаю задумываться, не слишком ли это усложняет ситуацию?

Есть ли более простой способ сделать это?Если нет, то каков наилучший способ структурировать действие create вокруг этой ассоциации has_many through:?

Ответы [ 2 ]

0 голосов
/ 26 декабря 2018

Это на самом деле намного проще, чем вы думаете.ActiveRecord создает _ids установщик и получатель для has_many ассоциаций.Сеттер автоматически добавит / удалит записи в таблице соединений.Например:

@task = Task.create!(user_ids: [1,2,3])
@task.user_ids # => [1,2,3]

Создает задачу и три строки в объединяемой таблице.

Это можно использовать в формах с помощниками коллекции :

<%= form_for(@task) do |f| %>
  ...
  <%= f.collection_checkboxes(:user_ids, User.all, :id, :name) %>
  ...
<% end %>

Здесь я просто предполагаю, что у ваших пользователей есть атрибут имени (используется для текста флажка).Вы можете использовать любую коллекцию, которую хотите, вместо User.all.

. Для внесения в белый список параметра user_ids (который является массивом) используйте параметр хеширования с массивом в качестве значения:

def task_params
  params.require(:task).permit(:foo, :bar, user_ids: [])
end

Это разрешает массив разрешенных скалярных типов.

0 голосов
/ 23 декабря 2018

Я думаю, что вы очень хорошо относитесь к своим ассоциациям.Таблица UserTask автоматически обновляется Rails каждый раз, когда вы добавляете объект в коллекцию (либо набор задач, назначенных пользователю, либо пользователей, назначенных задаче).Таким образом, с вашими текущими настройками вы сможете выполнить:

user = User.first 
task = Task.first
user.tasks << task

, что также автоматически создаст запись в таблице UserTask.

Таким образом, вы должны иметь возможность выполнить действие создания задачи примерно так:

task.users << User.find([1,2])

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