Anda dapat melakukannya sekaligus dengan cukup mudah menggunakan klausa MENGGUNAKAN ALTER TABEL :
Pemeran tipe SQL sederhana akan meninggalkan Anda dengan string 'true'
dan 'false'
jadi Anda ingin menambahkan MENGGUNAKAN. Saya akan melewati AR dan melakukannya dengan tangan:
connection.execute(%q(
alter table users
alter column active
type text
using case when active then 'active' else 'inactive' end
))
Bagian penting bagi Anda adalah using case ...
bagian di akhir. Anda dapat menggunakannya bersama dengan change_column
AR-ish biasa hal-hal dengan menipu AR agar melakukan Hal yang Benar:
class ChangeColumnTypeInUsers < ActiveRecord::Migration
def up
change_column :users, :active, "text using case when active then 'active' else 'inactive' end"
end
def down
change_column :users, :active, "boolean using active = 'active'"
end
end
Perhatikan bahwa saya menggunakan text
sebagai tipe kolom. Rel akan menggunakan varchar(255)
di dalam database ketika Anda mengatakan :string
tanpa batas, itu tidak ada gunanya dengan PostgreSQL karena menangani penyimpanan untuk semua jenis string hampir sama secara internal
, batasan panjang pada char(n)
dan varchar(n)
sebenarnya membuatnya lebih mahal untuk digunakan daripada text
. Maka hanya waktu :string
masuk akal dengan PostgreSQL adalah ketika Anda memiliki alasan untuk memasukkan :limit
tertentu (dan kemudian text
kolom dengan CHECK
batasan panjang akan lebih masuk akal tetapi AR terlalu bodoh untuk mengetahui tentang hal-hal "lanjutan" seperti CHECK
kendala).