Domanda

Ho due modelli: studente e progetto.Uno studente habtm progetti e uno studente di Project Habbtm.Ecco i due modelli:

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
.

Come puoi vedere, lo studente utilizza l'ereditarietà polimorfica dall'utente (la tabella utente ha una colonna di tipo, uno dei valori è lo studente).Ecco il controller che crea progetti:

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
.

Progetto e studente sono collegati tramite i join_table: Progetti_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
.

Il problema è che quando viene creato un progetto, lo Student_ID non viene passato alla tabella Progetti_Students.Come posso risolvere questo?

È stato utile?

Soluzione

Penso che tu intenda dire che lo studente usa "l'ereditarietà da tavolo singola" piuttosto che "l'ereditarietà polimorfica" di cui non esiste una cosa del genere.

Detto questo, dal momento che l'Associazione Habtm è sugli utenti e non agli studenti, controllerei la console per vedere se funziona:

Student.first.projects << Project.first
.

La prossima cosa che farei è usare "Build" invece di "Nuovo" quando istanziando il progetto:

@project = current_user.projects.build project_params
.

Suppongo che questo sia solo per creare nuovi progetti e che esiste un percorso diverso per aggiungere studenti a progetti.

Altri suggerimenti

Penso che tu stia pensando a questo sbagliato.Generalmente il _id è riservato alle chiavi straniere a una tabella correlata.Poiché non esiste una tabella Student, i binari potrebbero non essere in grado di collegare il student_id nella tabella di join in modo appropriato.

Prova a cambiare la tua tabella di join:

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
.

La tua tavola di join non dovrebbe preoccuparsi del tuo set di STI.Puoi gestirlo nei tuoi modelli.

Quindi pulisci solo le associazioni:

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
.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top