Como faço script/generate migration
para criar uma tabela de junção para um has_and_belongs_to_many
relacionamento?
O aplicativo é executado no Rails 2.3.2, mas também tenho o Rails 3.0.3 instalado.
Como faço script/generate migration
para criar uma tabela de junção para um has_and_belongs_to_many
relacionamento?
O aplicativo é executado no Rails 2.3.2, mas também tenho o Rails 3.0.3 instalado.
Onde:
class Teacher < ActiveRecord::Base
has_and_belongs_to_many :students
end
e
class Student < ActiveRecord::Base
has_and_belongs_to_many :teachers
end
para trilhos 4:
rails generate migration CreateJoinTableStudentTeacher student teacher
para trilhos 3:
rails generate migration students_teachers student_id:integer teacher_id:integer
para trilhos <3
script/generate migration students_teachers student_id:integer teacher_id:integer
(observe que o nome da tabela lista as duas tabelas de junção em ordem alfabética)
e somente para os trilhos 3 e abaixo, é necessário editar a migração gerada para que um campo de ID não seja criado:
create_table :students_teachers, :id => false do |t|
rails generate migration CreateJoinTableTeacherStudent teacher student
vez derails generate migration CreateJoinTableStudentTeacher student teacher
, é o mesmo? S (tudent) precisa antes de T (eacher)?Uma
has_and_belongs_to_many
tabela deve corresponder a este formato. Estou assumindo que os dois modelos aos quais se juntamhas_and_belongs_to_many
já estão no DB:apples
eoranges
:Se você usar o
:unique => true
no índice, deverá (no rails3) passar:uniq => true
parahas_and_belongs_to_many
.Mais informações: Rails Docs
ATUALIZADO 13-12-2010 Atualizei-o para remover a identificação e os carimbos de data e hora ... Basicamente,
MattDiPasquale
enunopolonia
estão corretos: não deve haver um ID e não deve haver carimbos de data e hora ou os trilhos não permitirãohas_and_belongs_to_many
funcionar.fonte
script/generate migration
...Você deve nomear na tabela os nomes dos 2 modelos que deseja conectar por ordem alfabética e colocar os dois IDs de modelo na tabela. Em seguida, conecte cada modelo um ao outro, criando as associações no modelo.
Aqui está um exemplo:
Mas isso não é muito flexível e você deve pensar em usar has_many: através
fonte
A resposta superior mostra um índice composto que não acredito que será usado para procurar maçãs de laranjas.
Eu encontrei a resposta em que isso é baseado em 'The Doctor What' útil e a discussão certamente também.
fonte
Nos trilhos 4, você pode usar de maneira simples
create_join_table: table1s,: table2s
isso é tudo.
Cuidado: você deve oferecer tabela1, tabela2 com alfanumérico.
fonte
Eu gosto de fazer:
rails g migration CreateJoinedTable model1:references model2:references
. Dessa forma, recebo uma migração parecida com esta:Eu gosto de ter um índice nessas colunas, porque frequentemente faço pesquisas usando essas colunas.
fonte
add_foreign_key
falhará se colocado na mesma migração que a que criou as tabelas.