Rails 4.x
Saat Anda sudah memiliki users
dan uploads
tabel dan ingin menambahkan hubungan baru di antara mereka.
Yang perlu Anda lakukan adalah: cukup buat migrasi menggunakan perintah berikut:
rails g migration AddUserToUploads user:references
Yang akan membuat file migrasi sebagai:
class AddUserToUploads < ActiveRecord::Migration
def change
add_reference :uploads, :user, index: true
end
end
Kemudian, jalankan migrasi menggunakan rake db:migrate
. Migrasi ini akan membantu menambahkan kolom baru bernama user_id
to uploads
table (merujuk id
kolom dalam users
tabel), PLUS juga akan menambahkan indeks pada kolom baru.
PEMBARUAN [Untuk Rails 4.2]
Rail tidak dapat dipercaya untuk mempertahankan integritas referensial; database relasional datang untuk menyelamatkan kami di sini. Artinya adalah bahwa kita dapat menambahkan batasan kunci asing di tingkat basis data itu sendiri dan memastikan bahwa basis data akan menolak operasi apa pun yang melanggar integritas referensial yang disetel ini. Seperti yang dikomentari @infoget, Rails 4.2 dikirimkan dengan dukungan asli untuk kunci asing (integritas referensial) . Ini tidak diperlukan tetapi Anda mungkin ingin menambahkan kunci asing (karena sangat berguna) ke referensi yang kami buat di atas.
Untuk menambahkan kunci asing ke referensi yang ada , buat migrasi baru untuk menambahkan kunci asing:
class AddForeignKeyToUploads < ActiveRecord::Migration
def change
add_foreign_key :uploads, :users
end
end
Untuk membuat referensi yang benar-benar baru dengan kunci asing (dalam Rails 4.2) , hasilkan migrasi menggunakan perintah berikut:
rails g migration AddUserToUploads user:references
yang akan membuat file migrasi sebagai:
class AddUserToUploads < ActiveRecord::Migration
def change
add_reference :uploads, :user, index: true
add_foreign_key :uploads, :users
end
end
Ini akan menambahkan kunci asing baru ke user_id
kolom uploads
tabel. Kunci referensi id
kolom dalam users
tabel.
CATATAN: Ini selain menambahkan referensi sehingga Anda masih perlu membuat referensi terlebih dahulu daripada kunci asing ( Anda dapat memilih untuk membuat kunci asing dalam migrasi yang sama atau file migrasi terpisah ). Rekaman Aktif hanya mendukung kunci asing kolom tunggal dan saat ini saja mysql
, mysql2
dan PostgreSQL
adaptor didukung. Jangan coba ini dengan adaptor lain seperti sqlite3
, dll. Lihat Panduan Rails: Kunci Asing untuk referensi Anda.
rails g migration AddUserToUploads user:references
menghasilkanadd_reference :uploads, :user, index: true, foreign_key: true
dalam migrasi yang sesuai....index: true, foreign_key: true
sebagai ganti o lineadd_foreign_key
.foreign_key
dant.reference
? Bukankaht.reference
pada dasarnya setara denganforiegn_key
+index
?Rel 5
Anda masih dapat menggunakan perintah ini untuk membuat migrasi:
Migrasi terlihat sedikit berbeda dari sebelumnya, tetapi masih berfungsi:
Perhatikan bahwa
:user
tidak:user_id
sumber
Local::User
alih - alihUser
melakukan sesuatu sepertirails g migration AddLocalUserToUploads user:references
.:index
t.index ["user_id"], name: "index_uploads_on_user_id", using: :btree
belongs_to :user
diUpload
kelas, sehingga kita dapat menggunakanupload.user
untuk mendapatkan contoh pengguna.jika Anda menyukai pendekatan
up
dandown
metode alternatif lain, coba ini:sumber
[Menggunakan Rails 5]
Hasilkan migrasi:
Ini akan membuat file migrasi:
Sekarang jika Anda mengamati file skema, Anda akan melihat bahwa tabel unggahan berisi bidang baru. Sesuatu seperti:
t.bigint "user_id"
ataut.integer "user_id"
.Migrasikan basis data:
sumber
Sintaks lain untuk melakukan hal yang sama adalah:
sumber
Hanya untuk mendokumentasikan jika seseorang memiliki masalah yang sama ...
Dalam situasi saya, saya telah menggunakan
:uuid
bidang, dan jawaban di atas tidak berfungsi untuk kasus saya, karena rel 5 membuat kolom menggunakan:bigint
sebagai gantinya:uuid
:sumber
Buat file migrasi
Nama kunci asing default
Ini akan membuat kolom user_id di tabel unggahan sebagai kunci asing
model pengguna:
unggah model:
Kustomisasi nama kunci asing:
Ini akan membuat kolom author_id di tabel unggahan sebagai kunci asing.
model pengguna:
unggah model:
sumber