Я очень новичок в 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
не существует.
Заранее спасибо за вашу помощь.
Вы делаете заявление в неправильном направлении
у вас есть task
это has_many
assistants
, поэтому 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, что это должно быть отношение «многие ко многим», потому что вы ограничиваете каждого пользователя только одной задачей.