Связь Rails HABTM не работает с полиморфной связью
Вопрос
У меня есть две модели:Студент и проект.Студенческие проекты HABTM и проект HABTM students.Вот две модели:
class Student < User
has_many :relationships, dependent: :destroy
has_many :employers, through: :relationships
has_and_belongs_to_many :projects, join_table: :projects_students
end
class Project < ActiveRecord::Base
has_many :relationships
belongs_to :employer
has_and_belongs_to_many :students, join_table: :projects_students
end
Как вы можете видеть, Student использует полиморфное наследование от User (таблица user имеет столбец type, одно из значений - Student).Вот контроллер, который создает проекты:
def create
@project = current_user.projects.new(project_params)
respond_to do |format|
if @project.save
format.html { redirect_to @project, notice: 'Project was successfully created.' }
format.json { render action: 'show', status: :created, location: @project }
else
format.html { render action: 'new' }
format.json { render json: @project.errors, status: :unprocessable_entity }
end
end
end
def project_params
params.require(:project).permit(:title, :category, :location, :budget,
:description, :projectdoc)
end
Проект и студент связаны через таблицу соединений :projects_students:
create_table "projects_students", force: true do |t|
t.integer "student_id"
t.integer "project_id"
end
add_index "projects_students", ["project_id"], name: "index_projects_students_on_project_id", using: :btree
add_index "projects_students", ["student_id"], name: "index_projects_students_on_student_id", using: :btree
Проблема в том, что при создании проекта идентификатор student_id не передается в таблицу projects_students.Как я могу это исправить?
Решение
Я думаю, что вы хотите сказать, что студент использует «одностое наследование стола», а не «полиморфному наследству» из которых нет такой вещи.
, который сказал, поскольку Ассоциация HABTM находится на пользователях, а не студентам, я бы проверил в консоли, чтобы увидеть, если это работает:
Student.first.projects << Project.first
.
Следующая вещь, которую я бы сделал, это использовать «сборку» вместо «нового» при создании проекта:
@project = current_user.projects.build project_params
.
Я полагаю, это только для создания новых проектов, и что есть другой маршрут для добавления студентов к проектам.
Другие советы
Я думаю, ты думаешь об этом неправильно.Как правило, _id
зарезервирован для внешних ключей к связанной таблице.Поскольку нет никакого Student
таблице, рельсы могут быть не в состоянии связать student_id
в вашей таблице соединений соответствующим образом.
Попробуйте изменить свою таблицу соединений:
create_table "projects_users", force: true do |t|
t.integer "user_id"
t.integer "project_id"
end
add_index "projects_users", ["project_id"], name: "index_projects_users_on_project_id", using: :btree
add_index "projects_users", ["user_id"], name: "index_projects_users_on_user_id", using: :btree
Ваша таблица соединений не должна заботиться о вашей настройке STI.Вы можете справиться с этим в своих моделях.
Итак, тогда просто очистите ассоциации:
class Student < User
has_many :relationships, dependent: :destroy
has_many :employers, through: :relationships
has_and_belongs_to_many :projects, join_table: :projects_users, foreign_key: :user_id
end
class Project < ActiveRecord::Base
has_many :relationships
belongs_to :employer
has_and_belongs_to_many :students, join_table: :projects_users, class_name: 'Student', association_foreign_key: :user_id
end