Jika saya membuat migrasi rel 3 baru dengan (misalnya)
rails g migration tester title:tester user:references
, semuanya berfungsi dengan baik ... namun jika saya menambahkan kolom dengan sesuatu di sepanjang baris:
rails g migration add_user_to_tester user:references
bidang referensi tidak dikenali. Singkatnya, pertanyaannya adalah: bagaimana cara menambahkan kolom referensi ke migrasi rel dari baris perintah?
ruby-on-rails
activerecord
migration
Plankton
sumber
sumber
EDIT : Ini adalah jawaban yang sudah usang dan tidak boleh diterapkan untuk Rails 4.x +
Anda tidak perlu menambahkan referensi ketika Anda dapat menggunakan id integer ke kelas referensi Anda.
Saya akan mengatakan keuntungan menggunakan referensi alih-alih bilangan bulat biasa adalah bahwa model akan ditentukan sebelumnya dengan hers_to dan karena model sudah dibuat dan tidak akan terpengaruh ketika Anda memigrasi sesuatu yang ada, tujuannya agak hilang.
Jadi saya akan melakukan ini sebagai gantinya:
Dan kemudian secara manual tambahkan milik: pengguna dalam model Penguji
sumber
Harap perhatikan bahwa Anda kemungkinan besar akan membutuhkan indeks pada kolom itu juga.
sumber
user.testers
Anda dapat menghilangkan indeks.rails g migration ...
dihasilkanadd_reference :installs, :device, index: true
juga membuat indeks.Dengan dua langkah sebelumnya yang disebutkan di atas, Anda masih kehilangan batasan kunci asing. Ini seharusnya bekerja:
sumber
Anda dapat menggunakan referensi dalam migrasi perubahan. Ini adalah kode Rails 3.2.13 yang valid:
cf: http://apidock.com/rails/ActiveRecord/ConnectionAdapters/SchemaStatements/change_table
sumber
down
metode, saya dapatkanActiveRecord::IrreversibleMigration
ketika memutar kembali menggunakan Rails 3.2. Saya juga harus pindahchange
keup
.Menjalankan
rails g migration AddUserRefToSponsors user:references
akan menghasilkan migrasi berikut:sumber
Saat menambahkan kolom, Anda harus membuat kolom itu bilangan bulat dan jika mungkin tetap dengan konvensi rel. Jadi untuk kasus Anda, saya berasumsi Anda sudah memiliki Tester dan model Pengguna, dan tabel penguji dan pengguna.
Untuk menambahkan kunci asing, Anda perlu membuat kolom integer dengan nama user_id (konvensi):
Kemudian tambahkan milik_ ke model penguji:
Dan Anda mungkin juga ingin menambahkan indeks untuk kunci asing (ini adalah sesuatu yang sudah dilakukan referensi untuk Anda):
sumber
Itu akan melakukan trik:
sumber
Anda dapat menambahkan referensi ke model Anda melalui baris perintah dengan cara berikut:
Ini akan menghasilkan file migrasi seperti:
Ini berfungsi dengan baik setiap kali saya menggunakannya ..
sumber
Untuk Rails 4
Generator menerima jenis kolom sebagai referensi (juga tersedia sebagai
belongs_to
).Migrasi ini akan membuat
user_id
kolom dan indeks yang sesuai:menghasilkan:
http://guides.rubyonrails.org/active_record_migrations.html#creating-a-standalone-migration
Untuk Rel 3
Helper disebut referensi (juga tersedia sebagai
belongs_to
).Migrasi ini akan membuat
category_id
kolom dengan tipe yang sesuai. Perhatikan bahwa Anda memasukkan nama model, bukan nama kolom. Rekaman Aktif menambahkan_id
untuk Anda.Jika Anda memiliki
belongs_to
asosiasi polimorfik maka referensi akan menambahkan kedua kolom yang diperlukan:Akan menambahkan kolom attachment_id dan
attachment_type
kolom string dengan nilai defaultPhoto
.http://guides.rubyonrails.org/v3.2.21/migrations.html#creating-a-standalone-migration
sumber