Respuestas:
Dónde:
class Teacher < ActiveRecord::Base
has_and_belongs_to_many :students
end
y
class Student < ActiveRecord::Base
has_and_belongs_to_many :teachers
end
para carriles 4:
rails generate migration CreateJoinTableStudentTeacher student teacher
para rieles 3:
rails generate migration students_teachers student_id:integer teacher_id:integer
para rieles <3
script/generate migration students_teachers student_id:integer teacher_id:integer
(tenga en cuenta que el nombre de la tabla enumera ambas tablas de unión en orden alfabético)
y luego solo para los rieles 3 e inferiores, debe editar su migración generada para que no se cree un campo de identificación:
create_table :students_teachers, :id => false do |t|
rails generate migration CreateJoinTableTeacherStudent teacher student
lugar de rails generate migration CreateJoinTableStudentTeacher student teacher
, ¿es lo mismo? ¿S (tudent) necesita antes que T (eacher)?
Una has_and_belongs_to_many
tabla debe coincidir con este formato. Supongo que los dos modelos a los que se unirán has_and_belongs_to_many
ya están en la base de datos: apples
y oranges
:
create_table :apples_oranges, :id => false do |t|
t.references :apple, :null => false
t.references :orange, :null => false
end
# Adding the index can massively speed up join tables. Don't use the
# unique if you allow duplicates.
add_index(:apples_oranges, [:apple_id, :orange_id], :unique => true)
Si usa el :unique => true
en el índice, entonces debería (en rails3) pasar :uniq => true
a has_and_belongs_to_many
.
Más información: Rails Docs
ACTUALIZADO 2010-12-13 Lo actualicé para eliminar la identificación y las marcas de tiempo ... Básicamente MattDiPasquale
y nunopolonia
son correctas: no debe haber una identificación y no debe haber marcas de tiempo o los rieles no permitirán has_and_belongs_to_many
trabajar.
script/generate migration
...
Debe asignar a la tabla los nombres de los 2 modelos que desea conectar por orden alfabético y colocar los dos identificadores de modelo en la tabla. Luego, conecte cada modelo entre sí creando las asociaciones en el modelo.
Aquí hay un ejemplo:
# in migration
def self.up
create_table 'categories_products', :id => false do |t|
t.column :category_id, :integer
t.column :product_id, :integer
end
end
# models/product.rb
has_and_belongs_to_many :categories
# models/category.rb
has_and_belongs_to_many :products
Pero esto no es muy flexible y debería pensar en usar has_many: through
La respuesta principal muestra un índice compuesto que no creo que se utilizará para buscar manzanas de naranjas.
create_table :apples_oranges, :id => false do |t|
t.references :apple, :null => false
t.references :orange, :null => false
end
# Adding the index can massively speed up join tables.
# This enforces uniqueness and speeds up apple->oranges lookups.
add_index(:apples_oranges, [:apple_id, :orange_id], :unique => true)
# This speeds up orange->apple lookups
add_index(:apples_oranges, :orange_id)
Encontré que la respuesta en la que se basa 'The Doctor What' es útil y la discusión también lo es.
En los rieles 4, puede usar de manera simple
create_join_table: table1s,: table2s
esto es todo.
Precaución: debe ofrecerford table1, table2 con alfanumérico.
Me gusta hacer:
rails g migration CreateJoinedTable model1:references model2:references
. De esa manera obtengo una migración que se ve así:
class CreateJoinedTable < ActiveRecord::Migration
def change
create_table :joined_tables do |t|
t.references :trip, index: true
t.references :category, index: true
end
add_foreign_key :joined_tables, :trips
add_foreign_key :joined_tables, :categories
end
end
Me gusta tener índice en estas columnas porque a menudo haré búsquedas usando estas columnas.
add_foreign_key
fallará si se coloca en la misma migración que la que creó las tablas.