Rails Habtm Relazione non funziona con relazione polimorfo
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?
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
.