Trilhos relação HABTM não trabalhar com polimórficos relação
Pergunta
Eu tenho dois modelos:Do aluno e do Projeto.Um estudante HABTM projetos e um Projeto HABTM alunos.Aqui estão os dois modelos:
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
Como você pode ver, o Aluno usa polimórficos herança do Usuário (O usuário tabela tem uma coluna de tipo, um dos valores é Estudante).Aqui é o controlador que cria projetos:
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
Projeto e Aluno são conectados através de 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
O problema é que quando um projeto é criado, o student_id não está sendo passado para o projects_students tabela.Como posso corrigir isso?
Solução
Eu acho que você quer dizer que o Aluno usa a "tabela única herança" ao invés de "polimórfico herança" de que não há tal coisa.
Que disse, pois o HABTM associação de usuários e não os alunos, que eu iria verificar no console para ver se isso funciona:
Student.first.projects << Project.first
A próxima coisa que eu faria é a utilização de "construir" em vez de "novo" ao instanciar o projeto:
@project = current_user.projects.build project_params
Suponho que isso é apenas para a criação de novos projetos, e que não há uma rota diferente para a adição de alunos para os projetos.
Outras dicas
Eu acho que você está pensando errado.Geralmente o _id
é reservado para chaves estrangeiras de uma tabela relacionada.Uma vez que não há Student
tabela, calhas podem ser incapaz de vincular a student_id
em seu junte-se a tabela de forma adequada.
Tente mudar a sua junte-se a tabela:
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
Seu junte-se a tabela não deve cuidar da sua IST o programa de configuração.Você pode lidar com isso em seus modelos.
Então, apenas limpeza a associações:
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