change_column_default的可逆迁移在Rails中没有任何默认值

And*_*imm 18 ruby-on-rails rails-migrations ruby-on-rails-4 rails-activerecord

Rails的指南,活动记录迁移说,你可以做

change_column_default :products, :approved, from: true, to: false
Run Code Online (Sandbox Code Playgroud)

change在Rails中有一个方法,类似于以下内容:

change_column_default :people, :height, from: nil, to: 0
Run Code Online (Sandbox Code Playgroud)

意图从没有任何默认值,到默认值为零.

但是,当我尝试回滚时,我得到了

ActiveRecord::IrreversibleMigration: ActiveRecord::IrreversibleMigration
Run Code Online (Sandbox Code Playgroud)

考虑到我给Rails中fromto,为什么没有接受它?

我正在使用Rails 4.2.0.

Ath*_*har 17

如果您使用mysql作为适配器,那么根据此链接http://apidock.com/rails/ActiveRecord/ConnectionAdapters/AbstractMysqlAdapter/change_column_default,您的change_column_default迁移运行如下

def change_column_default(table_name, column_name, default) #:nodoc:
 column = column_for(table_name, column_name)
 change_column table_name, column_name, column.sql_type, :default => default
end
Run Code Online (Sandbox Code Playgroud)

所以change_column当你打电话时,你会看到它自己调用change_column_default,根据这个链接 http://edgeguides.rubyonrails.org/active_record_migrations.html change_column迁移是不可逆转的.

这说明你获得的原因 ActiveRecord::IrreversibleMigration: ActiveRecord::IrreversibleMigration

因此,如果您想使用change_column_default必须添加def up和运行迁移def down.

我建议使用change_column,因为它已在change_column_default中调用.

def up
 change_column :people, :height, :integer, default: 0
end

def down
 change_column :people, :height, :integer, default: nil
end
Run Code Online (Sandbox Code Playgroud)


And*_*imm 13

使用from和在Rails 5+ to添加

链接到问题的指南是针对Edge Rails的,而不是针对Rails的发布版本.

可逆语法change_column_default是拉请求20018的结果.pull请求还更新了Edge Rails的Rails指南.

来自activerecord/lib/active_record/connection_adapters/abstract/schema_statements.rb:

-      def change_column_default(table_name, column_name, default)
+      # Passing a hash containing +:from+ and +:to+ will make this change
+      # reversible in migration:
+      #
+      #   change_column_default(:posts, :state, from: nil, to: "draft")
+      #
+      def change_column_default(table_name, column_name, default_or_changes)
Run Code Online (Sandbox Code Playgroud)

请求是在2015年6月27日提出的,这比2015年8月1日发布的任何版本的Rails更新.

Rails 4.2.3的迁移文档反映了可逆语法尚不可用的事实:

change_column_default :products, :approved, false
Run Code Online (Sandbox Code Playgroud)