0

У меня есть две модели: студент и проект. Студенческие проекты HABTM и студенты проекта HABTM. Вот две модели:Rails HABTM отношения не работают с полиморфными отношениями

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). Вот контроллер, который создает проекты:

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 

проекта и студентов, подключенных через join_table: 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. Как я могу это исправить?

ответ

1

Я думаю, вы хотите сказать, что ученик использует «однонаправленное наследование таблицы», а не «полиморфное наследование», которого нет.

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

Student.first.projects << Project.first 

Следующая вещь, которую я бы сделать, это использовать «построить» вместо «нового», когда инстанцирования проекта:

@project = current_user.projects.build project_params 

Я предполагаю, что это только для создания новых проектов, и что есть другой путь для добавления студентов к проектам.

+0

Он работает в консоли. Я попытался поместить это в сильные параметры, но это не сработает. Не существует списка флажков. Когда ученик обращается к проекту, метод создания выше завидуется, и я хочу, чтобы этот ученик был учеником. – Philip7899

+0

Я вижу. Я думаю, вы должны использовать «build» вместо «new», когда вы создаете новый проект. – davidfurber

+0

В чем разница? – Philip7899

0

Я думаю, вы думаете об этом неправильно. Обычно _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 
Смежные вопросы