【问题标题】:Change the default value for table column with migration使用迁移更改表列的默认值
【发布时间】:2017-07-28 20:20:02
【问题描述】:

我尝试将默认列值从 false 更改为 true。但是当我运行rake db:migrate VERSION=904984092840298 时,出现以下错误。

StandardError: An error has occurred, this and all later migrations canceled:

PG::InvalidTextRepresentation: ERROR:  invalid input syntax for type boolean: "---
:from: false
:to: true
"
: ALTER TABLE "plussites" ALTER COLUMN "hide_season_selector" SET DEFAULT '---
:from: false
:to: true
'

迁移

class ChangeDefaultvalueForHideSeasonSelector < ActiveRecord::Migration 
  def change 
    change_column_default :plussites, :hide_season_selector, from: false, to: true 
  end
end

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-4 activerecord ruby-on-rails-5


    【解决方案1】:

    您必须检查您使用的是哪个版本的 ActiveRecord。根据您的命令rake db:migrate,您仍在使用 rails 4.2 或更早版本。

    如果您使用的 ActiveRecord 最高为 4.2 (change_column_default 4.2.9),则没有 from/to 选项,您只能将新的默认选项定义为 param。

    class ChangeDefaultvalueForHideSeasonSelector < ActiveRecord::Migration 
      def change 
        change_column_default :plussites, :hide_season_selector, true 
      end
    end
    

    上述解决方案不允许回滚,因为该方法不知道之前的默认值是什么。这就是为什么你必须定义一个单独的 up 和 down 方法:

    class ChangeDefaultvalueForHideSeasonSelector < ActiveRecord::Migration
      def up
        change_column_default :plussites, :hide_season_selector, true
      end
    
      def down
        change_column_default :plussites, :hide_season_selector, false
      end
    end
    

    如果您使用的是 Rails 5 或更高版本,则可以通过 from/to (change_column_default 5.0.0.1) 定义之前的值和之后的值。在 Rails 5 上,您可以使用您选择的解决方案:

    class ChangeDefaultvalueForHideSeasonSelector < ActiveRecord::Migration 
      def change 
        change_column_default :plussites, :hide_season_selector, from: false, to: true 
      end
    end
    

    我希望这个解释能帮助在其他答案下使用 cmets 的人。

    【讨论】:

      【解决方案2】:

      这很奇怪,因为根据文档 (change_column_default),您的代码应该可以工作..

      作为一个选项,您可以定义 updown

      class ChangeDefaultvalueForHideSeasonSelector < ActiveRecord::Migration
        def up
          change_column_default :plussites, :hide_season_selector, true
        end
      
        def down
          change_column_default :plussites, :hide_season_selector, false
        end
      end
      

      【讨论】:

      • @Lory 但奇怪的是,您的原始代码没有,因为根据文档它看起来是正确的
      • 这对我来说也很奇怪,因为我完全按照文档写的。
      • @Andrey Deineko 是的,这个项目已经很老了,但今天就参与其中。也许这就是问题所在。
      • @Lory 顺便说一句,下次总是将环境信息添加到问题中,例如 Ruby/Rails 版本 - 这很重要 ;)
      • @Andray Deineko 我会听取你的建议。谢谢! Спасиба :)
      猜你喜欢
      • 2016-08-28
      • 2018-10-04
      • 1970-01-01
      • 2017-01-20
      • 2013-05-08
      • 2021-09-01
      • 1970-01-01
      • 2019-01-28
      • 2011-11-08
      相关资源
      最近更新 更多