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?

Foi útil?

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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top