Yanıtlar:
Nerede:
class Teacher < ActiveRecord::Base
has_and_belongs_to_many :students
end
ve
class Student < ActiveRecord::Base
has_and_belongs_to_many :teachers
end
raylar 4 için:
rails generate migration CreateJoinTableStudentTeacher student teacher
raylar 3 için:
rails generate migration students_teachers student_id:integer teacher_id:integer
raylar için <3
script/generate migration students_teachers student_id:integer teacher_id:integer
(tablo adının her iki birleştirme tablosunu alfabetik sırada listelediğine dikkat edin)
ve sonra yalnızca 3 ve altındaki raylar için, oluşturulan geçişinizi bir kimlik alanı oluşturulmayacak şekilde düzenlemeniz gerekir:
create_table :students_teachers, :id => false do |t|
rails generate migration CreateJoinTableTeacherStudent teacher student
bunun yerine deniyorum rails generate migration CreateJoinTableStudentTeacher student teacher
, aynı mı? S (tudent) 'in T'den (herer) önce olması gerekir mi?
Bir has_and_belongs_to_many
tablo bu formatla eşleşmelidir. Birleştirilecek iki modelin has_and_belongs_to_many
zaten DB'de olduğunu varsayıyorum : apples
ve 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)
Eğer kullanırsanız :unique => true
endeksi, o zaman (raylar 3. olarak) geçmelidir :uniq => true
için has_and_belongs_to_many
.
Daha fazla bilgi: Rails Docs
GÜNCELLENDİ 2010-12-13 Kimliği ve zaman damgalarını kaldıracak şekilde güncelledim ... Temelde MattDiPasquale
ve nunopolonia
doğru: Bir kimlik olmamalı ve zaman damgaları olmamalı veya raylar has_and_belongs_to_many
çalışmasına izin vermiyor .
script/generate migration
...
Tabloya, bağlanmak istediğiniz 2 modelin ismini alfabetik sırayla isimlendirmeli ve iki model kimliğini tabloya koymalısınız. Ardından, modeldeki ilişkilendirmeleri oluşturarak her modeli birbirine bağlayın.
İşte bir örnek:
# 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
Ancak bu çok esnek değildir ve has_many kullanmayı düşünmelisiniz: aracılığıyla
En üstteki cevap, portakallardan elma aramak için kullanılacağına inanmadığım bileşik bir indeksi gösteriyor.
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)
Bunun "The Doctor What" dan temel aldığı cevabı faydalı buldum ve tartışma kesinlikle çok faydalı.
Raylarda 4, basit kullanım yapabilirsiniz
create_join_table: table1s,: table2s
hepsi bu.
Dikkat: alfanümerik olan tablo1, tablo2'yi kullanmanız gerekir.
Yapmayı seviyorum:
rails g migration CreateJoinedTable model1:references model2:references
. Bu şekilde şuna benzeyen bir geçiş elde ederim:
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
Bu sütunlarda dizine sahip olmayı seviyorum çünkü sık sık bu sütunları kullanarak arama yapacağım.
add_foreign_key
tabloları oluşturan ile aynı geçişe yerleştirilirse başarısız olur.