【问题标题】:Rails HABTM relationship not working with polymorphic relationshipRails HABTM 关系不适用于多态关系
【发布时间】:2013-11-15 15:28:45
【问题描述】:

我有两个模型:学生和项目。一个学生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 的多态继承(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

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 表。我该如何解决这个问题?

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-4 rails-activerecord polymorphic-associations has-and-belongs-to-many


    【解决方案1】:

    我认为您的意思是说学生使用“单表继承”而不是“多态继承”,其中没有这样的事情。

    也就是说,由于 HABTM 关联是针对用户而不是学生,所以我会在控制台中检查这是否有效:

    Student.first.projects << Project.first
    

    接下来我要做的是在实例化项目时使用“build”而不是“new”:

    @project = current_user.projects.build project_params
    

    我想这只是为了创建新项目,并且将学生添加到项目中有不同的途径。

    【讨论】:

    • 它在控制台中工作。我尝试将其放入强参数中,但它不起作用。没有复选框列表-当学生申请项目时,上面的create方法令人羡慕,我希望该学生成为student_id。
    • 我明白了。我认为在实例化新项目时应该使用“build”而不是“new”。
    • 有什么区别?
    • Build 使用关联集实例化对象。
    【解决方案2】:

    我认为你想错了。通常_id 是为相关表的外键保留的。由于没有Student 表,rails 可能无法正确链接您的联接表中的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
    

    【讨论】:

      猜你喜欢
      • 2011-10-21
      • 2013-06-21
      • 1970-01-01
      • 1970-01-01
      • 2013-11-28
      • 1970-01-01
      • 1970-01-01
      • 2018-02-03
      • 1970-01-01
      相关资源
      最近更新 更多