【问题标题】:Changing table info with Rails migration使用 Rails 迁移更改表信息
【发布时间】:2011-09-22 03:13:05
【问题描述】:

在我最初的迁移中,我有这个:

create_table :credit_purchases do |t|
  t.column :amount, :decimal, :precision => 8, :scale => 2, :null => false
  t.column :time, :datetime, :null => false
end

这产生了以下 MySQL 表定义:

CREATE TABLE `credit_purchases` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `amount` decimal(8,2) NOT NULL,
  `time` datetime NOT NULL,
  PRIMARY KEY (`id`),
)

当我运行它时,它根本不会改变定义:

change_column :credit_purchases, :amount, :decimal, :precision => 8, :scale => 2
change_column :credit_purchases, :time, :datetime

我希望定义结果是:

CREATE TABLE `credit_purchases` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `amount` decimal(8,2) DEFAULT NULL,
  `time` datetime DEFAULT NULL,
  PRIMARY KEY (`id`),
)

我必须做什么才能产生预期的结果?我想避免通过迁移定义数据库约束。

【问题讨论】:

    标签: mysql ruby-on-rails database migration


    【解决方案1】:

    尝试显式添加:null => true

    【讨论】:

    • 是的,这会起作用,但要避免在迁移中指定数据库约束。
    • 为什么指定:null => true 可以解决问题?
    • 迁移是一件相当短暂的事情,需要特别注意。如果您想避免使用 DB 约束(而是更喜欢模型约束),这是一个完全有效的理念,添加 :null => true 将使您回到正轨。如果您希望您的 schema.rb 没有 :null => true 标记,我猜如果您使用 :null => true 应用迁移,然后没有它的另一个迁移,schema.rb 可能会“免费”任何:null 标记。
    • 太棒了。非常感谢您花时间注释您的原始答案。也欣赏哲学上的调整!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-17
    • 1970-01-01
    • 2013-12-26
    • 2012-05-09
    • 1970-01-01
    • 1970-01-01
    • 2016-05-14
    相关资源
    最近更新 更多