Rails HABTM връзка не работи с полиморфна връзка

Имам два модела: Студентски и Проектен. Студентски проекти HABTM и студенти по проект 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 използва полиморфно наследяване от User (Потребителската таблица има колона тип, една от стойностите е 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. Как мога да поправя това?




Отговори (2)


Мисля, че искате да кажете, че Student използва „наследяване на една таблица“, а не „полиморфно наследяване“, за което няма такова нещо.

Въпреки това, тъй като асоциацията HABTM е за потребители, а не за студенти, бих проверил в конзолата, за да видя дали това работи:

Student.first.projects << Project.first

Следващото нещо, което бих направил, е да използвам "build" вместо "new", когато инстанцирам проекта:

@project = current_user.projects.build project_params

Предполагам, че това е само за създаване на нови проекти и че има различен начин за добавяне на ученици към проекти.

person davidfurber    schedule 15.11.2013
comment
Работи в конзолата. Опитах се да го поставя в силните параметри, но не работи. Няма списък с квадратчета за отметка - Когато студент кандидатства за проект, методът за създаване по-горе се завижда и искам този студент да бъде student_id. - person Philip7899; 15.11.2013
comment
Виждам. Мисля, че трябва да използвате build вместо new, когато създавате нов проект. - person davidfurber; 15.11.2013
comment
Каква е разликата? - person Philip7899; 15.11.2013
comment
Build инстанцира обекта с набора от асоциации. - person davidfurber; 15.11.2013

Мисля, че мислите погрешно за това. Обикновено _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
person codenamev    schedule 15.11.2013