ruby-on-rails - 在Rails中没有默认值的情况下,change_column_default的可逆迁移

标签 ruby-on-rails ruby-on-rails-4 rails-activerecord rails-migrations

Rails guides to active record migrations表示您可以

change_column_default :products, :approved, from: true, to: false


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

change_column_default :people, :height, from: nil, to: 0


目的是从没有任何默认值转变为默认值为零。

但是,当我尝试将其回滚时,

ActiveRecord::IrreversibleMigration: ActiveRecord::IrreversibleMigration


考虑到我给Rails一个fromto,为什么它不接受呢?

我正在使用Rails 4.2.0。

最佳答案

如果您使用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


如您所见,当您调用change_column并根据此链接时,它会在自身内部调用change_column_default
http://edgeguides.rubyonrails.org/active_record_migrations.html
change_column迁移是不可逆的。

这说明了为什么得到ActiveRecord::IrreversibleMigration: ActiveRecord::IrreversibleMigration

因此,如果要使用change_column_default运行迁移,则必须添加def updef 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

关于ruby-on-rails - 在Rails中没有默认值的情况下,change_column_default的可逆迁移,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31552604/

相关文章:

ruby-on-rails - Rails - 强制模型通过工厂方法创建

ruby-on-rails - Rails 4 - 无法连接到 rails 4 上的数据库表

ruby-on-rails - 如何禁用 Rails 应用程序中的迁移功能?

javascript - jquery-autocomplete 在 rails 中出错

Rails 3.1 中的 JavaScript 单元测试

ruby-on-rails - Brakeman 警告动态渲染路径

ruby-on-rails - Ruby on Rails 错误:Uglifier::错误:意外的标记:运算符(<)

ruby-on-rails - 如何在 ActiveRecord 中编写集合操作查询而不在 SQL 中编写 INTERSECT、UNION 或 EXCEPT?

postgresql - 查找存在时间戳的记录

ruby-on-rails - 你可以用ruby重新定义一个类吗?或者这只是在 irb