Sen alfabetik yılında, sadece bir restaurant_id
ve user_id
(birincil anahtarı) ile ayrı katılmak tablo eklemek gerekir.
İlk önce geçişlerinizi çalıştırın, ardından oluşturulan geçiş dosyasını düzenleyin.
Raylar 3
rails g migration create_restaurants_users_table
raylar 4:
rails g migration create_restaurants_users
Raylarkaynaktan 5
rails g migration CreateJoinTableRestaurantUser restaurants users
0:
JoinTable adının bir parçası ise tabloları katılmak üretecek bir jeneratör de vardır:
Sizin göç dosyası (:id => false
not; o) birincil anahtar oluşturulmasını engeller ne:
Raylar 3
class CreateRestaurantsUsers < ActiveRecord::Migration
def self.up
create_table :restaurants_users, :id => false do |t|
t.references :restaurant
t.references :user
end
add_index :restaurants_users, [:restaurant_id, :user_id]
add_index :restaurants_users, :user_id
end
def self.down
drop_table :restaurants_users
end
end
Raylar
class CreateRestaurantsUsers < ActiveRecord::Migration
def change
create_table :restaurants_users, id: false do |t|
t.belongs_to :restaurant
t.belongs_to :user
end
end
end
t.belongs_to
4 otomatik gerekli indeksleri yaratacaktır. def change
, bir ileri veya geri alma geçişini otomatik olarak algılar, yukarı/aşağıya gerek yoktur.
Raylar 5
create_join_table :restaurants, :users do |t|
t.index [:restaurant_id, :user_id]
end
Not: table_name
denilen create_join_table parametre olarak geçirilebilir bir özel tablo adı için bir seçenek de vardır.Varsayılan olarak docs
itibaren katılmak tablonun adı alfabetik sırayla, create_join_table sağlanan ilk iki bağımsız değişken birliğinden geliyor. Tablonun adını özelleştirmek için bir sağlayın: TABLE_NAME seçeneği:
Çözüm benim için mükemmel bir şekilde çalıştı. Bu yöntemi kullanırken basit bir hata yaptım, bir komisyonu db denedim: raylar komutundan sonra geçiş yap ve tabloyu oluşturmadı. Bir komisyon db: rollback yapmak zorunda kaldım sonra dosyayı db: d tırma yap ama şimdi her şey çalışıyor. – dbslone
@Dex - Sadece meraktan dolayı, neden ters sütun sırasına göre tanımlanmış ikinci bir bileşik endeks kullandığınızı açıklayabilir misiniz? Sütun düzeninin önemli olmadığı izleniminin altındaydım. Ben DBA değilim, sadece kendi anlayışımı geliştirmek istiyorum. Teşekkürler! – plainjimbo
@Jimbo Bu şekilde buna ihtiyacınız yok, gerçekten sizin sorgularınıza bağlı. Endeksler soldan sağa okunur, böylece 'restaurant_id' üzerinde arama yapıyorsanız ilk mesaj en hızlı olacaktır. İkinci kullanıcı, 'user_id' üzerinde arama yapıyorsanız yardımcı olacaktır. Her ikisinde de arama yapıyorsanız, veritabanının sadece bir tanesine ihtiyaç duyacak kadar akıllı olacağını düşünürdüm. Yani sanırım ikinci olanın bir hayli birleştirilmesi gerekmiyor. Bu sadece bir örnek oldu. Bu bir Rails sorusuydu, bu yüzden DB bölümünde gönderme daha eksiksiz bir yanıt verecekti. – Dex