Jawaban:
Dimana:
class Teacher < ActiveRecord::Base
has_and_belongs_to_many :students
end
dan
class Student < ActiveRecord::Base
has_and_belongs_to_many :teachers
end
untuk rel 4:
rails generate migration CreateJoinTableStudentTeacher student teacher
untuk rel 3:
rails generate migration students_teachers student_id:integer teacher_id:integer
untuk rel <3
script/generate migration students_teachers student_id:integer teacher_id:integer
(perhatikan nama tabel mencantumkan kedua tabel bergabung dalam urutan abjad)
dan kemudian hanya untuk rails 3 dan di bawahnya, Anda perlu mengedit migrasi yang Anda buat sehingga bidang id tidak dibuat:
create_table :students_teachers, :id => false do |t|
rails generate migration CreateJoinTableTeacherStudent teacher student
bukan rails generate migration CreateJoinTableStudentTeacher student teacher
, adalah bahwa sama? Apakah S (Tudent) perlu sebelum T (guru)?
Sebuah has_and_belongs_to_many
meja harus sesuai format ini. Saya berasumsi dua model yang akan digabungkan has_and_belongs_to_many
sudah ada di DB: apples
dan 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)
Jika Anda menggunakan :unique => true
di indeks, maka Anda harus (di rails3) lolos :uniq => true
ke has_and_belongs_to_many
.
Informasi lebih lanjut: Rails Docs
UPDATED 2010-12-13 Saya telah memperbaruinya untuk menghapus id dan cap waktu ... Pada dasarnya MattDiPasquale
dan nunopolonia
benar: Tidak boleh ada id dan tidak boleh ada cap waktu atau rel tidak akan memungkinkan has_and_belongs_to_many
untuk bekerja.
script/generate migration
...
Anda harus menamai tabel dengan nama 2 model yang ingin Anda hubungkan berdasarkan urutan abjad dan meletakkan kedua id model di tabel. Kemudian hubungkan setiap model satu sama lain membuat asosiasi dalam model.
Berikut contohnya:
# 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
Tetapi ini tidak terlalu fleksibel dan Anda harus berpikir untuk menggunakan has_many: through
Jawaban teratas menunjukkan indeks komposit yang saya tidak percaya akan digunakan untuk mencari apel dari jeruk.
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)
Saya menemukan jawaban yang didasarkan pada 'The Doctor What' berguna dan diskusi yang pasti juga.
Di rel 4, Anda dapat menggunakan dengan mudah
create_join_table: table1s,: table2s
itu semua.
Perhatian: Anda harus keluar dari tabel1, tabel2 dengan alfanumerik.
Saya suka melakukan:
rails g migration CreateJoinedTable model1:references model2:references
. Dengan cara itu saya mendapatkan migrasi yang terlihat seperti ini:
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
Saya suka memiliki indeks pada kolom ini karena saya akan sering melakukan pencarian menggunakan kolom ini.
add_foreign_key
akan gagal jika ditempatkan dalam migrasi yang sama seperti yang membuat tabel.