将布尔列类型更改为int

lea*_*347 2 ruby postgresql ruby-on-rails rails-migrations ruby-on-rails-4

我在Postgres DB表中有一个列是布尔类型.我想将它更改为整数,因为我需要的不仅仅是该列中的true/false.

我还想将所有真值更改为1,将假值更改为2.

这很容易在Rails中完成吗?我试图通过迁移文件和迁移我的数据库来做到这一点.

mu *_*ort 14

是的,您可以通过一次迁移来完成此更改.唯一棘手的部分是需要告诉数据库如何将布尔值转换为整数.

这样做的方法是使用一个USING子句ALTER TABLE来提供映射.原始SQL版本如下所示:

alter table models
alter column c type integer
using case when c then 1 else 2 end
Run Code Online (Sandbox Code Playgroud)

并因此转化为迁移:

def change
  change_column :models, :c, :integer, :using => 'case when c then 1 else 2 end'
end
Run Code Online (Sandbox Code Playgroud)

布尔列只能包含TRUE或者FALSE这样简单CASE就足够了.如果您允许NULLs并希望保留它们,那么:

:using => 'case when c is null then null when c then 1 else 2 end'
Run Code Online (Sandbox Code Playgroud)

应该做的伎俩.

当然,您必须更新所有代码才能正确使用这些新整数.