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>
.