ruby-on-rails - Rails 迁移 - 带有类型转换的change_column

标签 ruby-on-rails ruby-on-rails-3

我已经在 google 上搜索了一下,似乎对我的问题没有令人满意的答案。

我有一个包含字符串类型列的表。 我想运行以下迁移:

class ChangeColumnToBoolean < ActiveRecord::Migration
    def up
        change_column :users, :smoking, :boolean
    end
end

当我运行这个时,我收到以下错误

PG::Error: ERROR:  column "smoking" cannot be cast automatically to type boolean
HINT:  Specify a USING expression to perform the conversion.
: ALTER TABLE "users" ALTER COLUMN "smoking" TYPE boolean

我知道我可以使用纯 SQL 执行此迁移,但如果我可以使用 Rails 来执行此迁移,那就更好了。我浏览了 Rails 代码,似乎没有这种可能性,但也许有人知道一种方法?

我对以下内容不感兴趣: - 纯SQL - 删除列 - 创建另一列,转换数据,删除原始列,然后重命名

最佳答案

如果 smoking 列中的字符串已经是有效的 bool 值,则以下语句将更改列类型而不丢失数据:

change_column :users, :smoking, 'boolean USING CAST(smoking AS boolean)'

类似地,您可以使用此语句将列转换为整数:

change_column :table_name, :column_name, 'integer USING CAST(column_name AS integer)'

我正在使用 Postgres。不确定此解决方案是否适用于其他数据库。

关于ruby-on-rails - Rails 迁移 - 带有类型转换的change_column,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17075173/

相关文章:

ruby - 在 ruby​​ 中格式化日期/时间

ruby-on-rails - 无法为数据库添加种子;由于连接被拒绝而无法工作?

mysql - 转换为 Float 返回 ActiveRecord::StatementInvalid: Mysql2::Error

ruby-on-rails - 使用 RSpec 在 Rails 引擎中测试代码

ruby-on-rails-3 - “捆绑安装”正在创建 ./rails 文件夹

ruby-on-rails - 基于正则表达式的Rails 3路由

ruby-on-rails - Sinatra 对像 Controller 这样的 Web 服务的好处

css - Rails ERB 变量不响应 CSS

ruby-on-rails - 未获取通过 ajax 发布请求 rails 发送的表单数据

ruby-on-rails-3 - Rails3 MiniMagick 在 Choose_processor 上加载错误