RUDE

Rails: миграция для новой ассоциации has_many

Я очень новичок в Ruby и Rails, так что это своего рода вопрос "Скажи мне, что я делаю неправильно":

У меня есть проект с некоторыми существующими ApplicationRecords. Теперь мне нравится добавлять новую ассоциацию has_many к одному из них (под названием «Задача»).

has_many :assistants, class_name: "User"

Я указываю здесь имя класса, так как уже существует другая ассоциация has_many :users. (Для каждой задачи может быть 0-* помощников.)

Как правильно создать Migration для этого? Я создал следующее:

class AddAssistantsToTask < ActiveRecord::Migration[6.1]
  def change
    add_reference :tasks, :assistant, null: true, foreign_key: {to_table: :users}, type: :uuid
  end
end

В контроллере я пытаюсь добавить пользователей в ассоциацию помощника:

if !@task.assistants.includes(@user)
    @task.assistants << @user
end

На данный момент кажется, что все работает так, как ожидалось. Когда я пытаюсь запросить добавленного пользователя с помощью консоли Rails, используя

Task.find("some id").assistants.count

Я получаю сообщения об ошибках, что столбец users.task_id не существует.

Заранее спасибо за вашу помощь.


39
1

Ответ:

Решено

Вы делаете заявление в неправильном направлении

у вас есть task это has_manyassistants, поэтому foreign_key должно быть на модели assistant, в этом случае Пользователи

class AddAssistantsToTask < ActiveRecord::Migration[6.1]
  def change
    # Add foreign key assistant_id to users that points to tasks
    add_reference :users, :assistant, type: :uuid, null: true, foreign_key: { to_table: :tasks }
  end
end

Теперь вы можете видеть, что имя Assistant_id в таблице Users не имеет смысла, поэтому я бы переименовал его во что-то вроде Assisted_Task или просто Task.

class AddAssistantsToTask < ActiveRecord::Migration[6.1]
  def change
    # Add foreign key assistant_id to users that points to
    add_reference :users, :assisted_task, type: :uuid, null: true, foreign_key: { to_table: :tasks }
  end
end
has_many :assistants, class_name: "User", foreign_key: :assisted_task_id

или с task

class AddAssistantsToTask < ActiveRecord::Migration[6.1]
  def change
    # Add foreign key assistant_id to users that points to
    add_reference :users, :task, type: :uuid, null: true, foreign_key: true
  end
end
has_many :assistants, class_name: "User"

Но я согласен с @BroiSatse, что это должно быть отношение «многие ко многим», потому что вы ограничиваете каждого пользователя только одной задачей.