Możesz to zrobić za jednym razem całkiem łatwo, używając klauzuli USING TABELA :
Proste rzutowanie typu SQL pozostawi cię z ciągami 'true'
i 'false'
więc chcesz dodać USING. Ominąłbym AR i zrobiłbym to ręcznie:
connection.execute(%q(
alter table users
alter column active
type text
using case when active then 'active' else 'inactive' end
))
Ważną częścią dla Ciebie jest using case ...
część na końcu. Możesz użyć tego razem ze zwykłą change_column
w stylu AR rzeczy, nakłaniając AR do zrobienia właściwej rzeczy:
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
Zauważ, że używam text
jako typ kolumny. Railsy będą używać varchar(255)
wewnątrz bazy danych, gdy powiesz :string
bez ograniczeń, jest to dość bezcelowe w PostgreSQL, ponieważ obsługuje on przechowywanie wszystkich typów łańcuchów prawie tak samo wewnętrznie
, ograniczenia długości dla char(n)
i varchar(n)
w rzeczywistości czynią je droższymi w użyciu niż text
. Wtedy tylko czas :string
ma sens w przypadku PostgreSQL, gdy masz powód, aby dołączyć określony :limit
(a potem text
kolumna z CHECK
ograniczenie długości byłoby bardziej sensowne, ale AR jest zbyt głupi, aby wiedzieć o „zaawansowanych” rzeczach, takich jak CHECK
ograniczenia).