我有两个模型:学生和项目。一个学生 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

Project 和 Student 通过 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 表。我怎样才能解决这个问题?

有帮助吗?

解决方案

我认为你的意思是说学生使用“单表继承”而不是“多态继承”,没有这样的东西。

所说,由于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