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
# This might cause trouble if you have strings longer
# than 255 characters.
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 :limit => 255
implicit implisit . Tetapi jika Anda menggunakan text
, Anda akan mendapatkan jenis string panjang arbitrer apa pun yang didukung database. PostgreSQL memungkinkan Anda untuk menggunakan varchar
kolom tanpa panjang tetapi sebagian besar basis data 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 dengan tipe text
dan salah satu dari jenis varchar
(tetapi varchar(n)
adalah berbeda). Selanjutnya, jika Anda menerapkan di atas PostgreSQL, tidak ada alasan untuk menggunakan :string
(AKA varchar
) sama sekali, database memperlakukan text
dan varchar(n)
sama secara internal kecuali untuk batasan panjang ekstra untuk varchar(n)
; anda hanya boleh 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.
Sebagai tambahan, jika Anda menggunakan string
kolom di mana saja, Anda harus selalu menentukan :limit
sebagai pengingat untuk diri 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 mengajukan pengecualian, MySQL akan diam-diam memotong string atau mengeluh (tergantung pada konfigurasi server), SQLite akan membiarkannya berjalan apa 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 diisolasi dari ActiveRecord Anda. Anda mungkin sudah melakukan ini, tetapi saya pikir saya akan tetap menyebutkannya.
Perbarui :Versi ActiveRecord yang lebih baru memahami varchar
tanpa batas jadi, dengan PostgreSQL setidaknya, Anda dapat mengatakan:
change_column :your_table, :your_column, :string, limit: nil
untuk mengubah varchar(n)
kolom ke varchar
. text
dan varchar
masih hal yang sama sejauh menyangkut PostgreSQL tetapi beberapa pembuat formulir akan memperlakukannya secara berbeda:varchar
mendapat <input type="text">
sedangkan text
mendapat <textarea>
multi multi-baris .