質問

2 つのモデルがあります。学生とプロジェクト。HABTM プロジェクトの学生とプロジェクト HABTM の学生。以下に 2 つのモデルがあります。

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 列があり、値の 1 つは 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テーブルに渡されないことです。これを修正するにはどうすればよいですか?

役に立ちましたか?

解決

あなたは、学生が「多型継承」ではなく「単一のテーブルの継承」を使用すると言うことは、そのようなことがないということです。

は、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