Anda harus menggunakan text
dengan Rails jika Anda menginginkan string tanpa batas panjang. Migrasi seperti ini:
def up
change_column :your_table, :your_column, :text
end
def down
change_column :your_table, :your_column, :string
end
harus menyelesaikan masalah. Anda mungkin ingin :null => false
atau beberapa opsi lain di akhir itu juga.
Saat Anda menggunakan string
kolom tanpa batas eksplisit, Rails akan menambahkan implisit :limit => 255
. Tetapi jika Anda menggunakan text
, Anda akan mendapatkan jenis string panjang apa pun yang didukung database. PostgreSQL memungkinkan Anda untuk menggunakan varchar
kolom tanpa panjang tetapi sebagian besar database menggunakan tipe terpisah untuk itu dan Rails tidak tahu tentang varchar
tanpa panjang. Anda harus menggunakan text
di Rails untuk mendapatkan text
kolom di PostgreSQL. Tidak ada perbedaan dalam PostgreSQL antara kolom jenis text
dan satu jenis varchar
(tapi varchar(n)
yang berbeda). Selain itu, jika Anda menerapkan di atas PostgreSQL, tidak ada alasan untuk menggunakan :string
(AKA varchar
) sama sekali, database memperlakukan text
danvarchar(n)
yang sama secara internal kecuali untuk batasan panjang ekstra untuk varchar(n)
; Anda sebaiknya hanya menggunakan varchar(n)
(AKA :string
) jika Anda memiliki batasan eksternal (seperti formulir pemerintah yang menyatakan bahwa bidang 432 pada formulir 897 / B akan memiliki panjang 23 karakter) pada ukuran kolom.
Selain itu, jika Anda menggunakan string
kolom di mana saja, Anda harus selalu menentukan :limit
sebagai pengingat bagi diri Anda sendiri bahwa ada batas dan Anda harus memiliki validasi dalam model untuk memastikan bahwa batas tersebut tidak terlampaui. Jika Anda melebihi batas, PostgreSQL akan mengeluh dan memunculkan pengecualian, MySQL akan memotong string atau mengeluh secara diam-diam (tergantung pada konfigurasi server), SQLite akan membiarkannya lewat sebagaimana adanya, dan database lain akan melakukan sesuatu yang lain (mungkin mengeluh) .
Selain itu, Anda juga harus mengembangkan, menguji, dan menerapkan di atas database yang sama (yang biasanya berupa PostgreSQL di Heroku), Anda bahkan harus menggunakan versi server database yang sama. Ada perbedaan lain antara database (seperti perilaku GROUP BY) yang tidak akan mengisolasi Anda dari ActiveRecord. Anda mungkin sudah melakukan ini tetapi saya pikir saya akan menyebutkannya juga.
Pembaruan : Versi ActiveRecord yang lebih baru mengerti varchar
tanpa batas, jadi, dengan PostgreSQL setidaknya, Anda dapat mengatakan:
change_column :your_table, :your_column, :string, limit: nil
untuk mengubah varchar(n)
kolom menjadi varchar
. text
dan varchar
masih sama sejauh menyangkut PostgreSQL tetapi beberapa pembuat formulir akan memperlakukannya secara berbeda: varchar
mendapat <input type="text">
sementara text
mendapat multi-baris <textarea>
.
change
jika tidak dapat secara otomatis membalikkan perubahan jenis dan Panduan Migrasi mengatakan bahwa "[metode perubahan] Metode ini lebih disukai untuk menulis migrasi konstruktif (menambahkan kolom atau tabel)" danchange_column
isn ' t dalam daftar yang Anda tunjuk jadi saya pikir Anda benar. Saya memperbaikinya untuk menggunakanup
/down
(dengan peringatan didown
), terima kasih atas perhatiannya.text
hanya untuk mendapatkan panjang tak terbatas; Anda bisa menggunakan tidak dibatasivarchar
. Rails memberlakukan batas ganjil ini, bukan PostgreSQL.Meskipun jawaban yang diterima sangat bagus, saya ingin menambahkan jawaban di sini yang semoga lebih baik berkaitan dengan pertanyaan poster asli bagian 2, untuk non ahli seperti saya.
menghasilkan migrasi perancah
Anda dapat menghasilkan migrasi untuk menahan perubahan Anda dengan mengetik di konsol Anda (cukup ganti
table
untuk nama tabel Anda, dancolumn
untuk nama kolom Anda)rails generate migration change_table_column
Ini akan menghasilkan migrasi kerangka di dalam folder aplikasi / db / migrate / Rails Anda. Migrasi ini adalah placeholder untuk kode migrasi Anda.
Misalnya saya ingin membuat migrasi untuk mengubah tipe kolom dari
string
menjaditext
, dalam tabel bernama TodoItems:class ChangeTodoItemsDescription < ActiveRecord::Migration def change # enter code here change_column :todo_items, :description, :text end end
Menjalankan migrasi Anda
Setelah Anda memasukkan kode untuk mengubah kolom, jalankan saja:
rake db:migrate
Untuk menerapkan migrasi Anda. Jika Anda membuat kesalahan, Anda selalu dapat mengembalikan perubahan dengan:
rake db:rollack
Metode Naik dan Turun
Referensi jawaban yang diterima
Up
danDown
metode, bukanChange
metode yang lebih baru . Sejak rail 3.2 gaya lama Metode Naik dan Turun menyajikan beberapa keunggulan dibandingkan metode Perubahan yang lebih baru. 'Atas dan Bawah' hindariActiveRecord::IrreversibleMigration exception
. Sejak rilis Rails 4 Anda dapat menggunakanreversible
untuk menghindari kesalahan ini:class ChangeProductsPrice < ActiveRecord::Migration def change reversible do |dir| change_table :products do |t| dir.up { t.change :price, :string } dir.down { t.change :price, :integer } end end end end
Nikmati Rails :)
sumber