Question

J'ai deux modèles :Étudiant et projet.Un projet étudiant HABTM et un projet étudiant HABTM.Voici les deux modèles :

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

Comme vous pouvez le voir, Student utilise l'héritage polymorphe de User (la table user a une colonne de type, l'une des valeurs est Student).Voici le contrôleur qui crée les projets :

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

Le projet et l'étudiant sont connectés via la 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

Le problème est que lorsqu'un projet est créé, le student_id n'est pas transmis à la tableprojects_students.Comment puis-je réparer cela?

Était-ce utile?

La solution

Je pense que vous voulez dire que l'étudiant utilise "héritage de la table unique" plutôt que "héritage polymorphique" dont il n'y a rien de tel.

Cela dit, puisque l'association HABTM est sur les utilisateurs et non des étudiants, je vérifierais la console pour voir si cela fonctionne:

Student.first.projects << Project.first

la prochaine chose que je ferais est d'utiliser "Construire" au lieu de "Nouveau" lors de l'instanciation du projet:

@project = current_user.projects.build project_params

Je suppose que cela ne consiste à créer de nouveaux projets et qu'il existe une voie différente pour ajouter des étudiants à des projets.

Autres conseils

Je pense que vous y réfléchissez mal.Généralement le _id est réservé aux clés étrangères d’une table associée.Puisqu'il n'y a pas Student table, les rails peuvent ne pas être en mesure de relier le student_id dans votre table de jointure de manière appropriée.

Essayez de changer votre table de jointure :

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

Votre table de jointure ne devrait pas se soucier de votre configuration STI.Vous pouvez gérer cela dans vos modèles.

Alors nettoyez simplement les associations :

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top