Вопрос

У меня есть две модели:Студент и проект.Студенческие проекты 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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top