Anda perlu menambahkan tabel gabungan terpisah hanya dengan a restaurant_id
dan user_id
(tanpa kunci utama), dalam urutan abjad .
Pertama-tama, jalankan migrasi Anda, lalu edit file migrasi yang dibuat.
Rel 3
rails g migration create_restaurants_users_table
Rel 4 :
rails g migration create_restaurants_users
Rel 5
rails g migration CreateJoinTableRestaurantUser restaurants users
Dari dokumen :
Ada juga generator yang akan menghasilkan tabel gabungan jika JoinTable adalah bagian dari namanya:
File migrasi Anda (perhatikan :id => false
; itu yang mencegah pembuatan kunci utama):
Rel 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
Rel 4
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
secara otomatis akan membuat indeks yang diperlukan. def change
akan otomatis mendeteksi migrasi maju atau mundur, tidak perlu naik / turun.
Rel 5
create_join_table :restaurants, :users do |t|
t.index [:restaurant_id, :user_id]
end
Catatan: Ada juga opsi untuk nama tabel khusus yang dapat diteruskan sebagai parameter untuk dipanggil create_join_table table_name
. Dari dokumen
Secara default, nama tabel gabungan berasal dari gabungan dua argumen pertama yang disediakan untuk create_join_table, dalam urutan abjad. Untuk menyesuaikan nama tabel, berikan opsi: nama_tabel:
restaurant_id
. Yang kedua akan membantu jika Anda terus mencariuser_id
. Jika Anda mencari keduanya, menurut saya database akan cukup pintar untuk hanya membutuhkan satu. Jadi saya kira yang kedua tidak perlu digabungkan. Ini lebih dari sekedar contoh. Ini adalah pertanyaan Rails, jadi posting di bagian DB akan menghasilkan jawaban yang lebih lengkap.rails g migration create_restaurants_users
tanpa tabel di akhir.Jawabannya di sini cukup kuno. Mulai Rails 4.0.2, migrasi Anda memanfaatkan
create_join_table
.Untuk membuat migrasi, jalankan:
Ini akan menghasilkan yang berikut:
Jika Anda ingin mengindeks kolom ini, hapus tanda komentar pada baris yang bersangkutan dan Anda siap melakukannya!
sumber
unique: true
. Ini akan mencegah hubungan duplikat dibuat.Saat membuat tabel gabungan, perhatikan baik-baik persyaratan bahwa kedua tabel harus dicantumkan dalam urutan abjad dalam nama / kelas migrasi. Ini dapat dengan mudah menggigit Anda jika nama model Anda serupa, misalnya "abc" dan "abb". Jika Anda lari
Hubungan Anda tidak akan bekerja seperti yang diharapkan. Anda harus menggunakan
sebagai gantinya.
sumber
Untuk hubungan HABTM, Anda perlu membuat tabel gabungan. Hanya ada tabel gabungan dan tabel itu tidak boleh memiliki kolom id. Coba migrasi ini.
Anda harus memeriksa tutorial panduan rel hubungan ini
sumber