【问题标题】:Rails 4: Remove not null constraint from table column with migration?Rails 4:通过迁移从表列中删除非空约束?
【发布时间】:2014-04-16 02:38:57
【问题描述】:

鉴于以下schema.rb

  create_table "people", force: true do |t|
    t.string   "name",  null: false
    t.integer  "age"
    t.integer  "height"
    t.string   "email"
    t.boolean  "married",  default: false
    t.text     "bio"
    t.integer  "fav_number"
    t.decimal  "lucky_num",  precision: 2, scale: 2
    t.datetime "birthday"
    t.datetime "created_at"
    t.datetime "updated_at"
  end

我想删除name 默认值null: false。我尝试使用change_column_default 运行单独的迁移,但这对schema.rb 没有影响。有什么建议吗?

【问题讨论】:

  • 它已经投入生产了吗?否则,您可以简单地回滚并手动删除默认值。
  • @rails4guides.com 这就是我最终所做的。我认为可能有更好的方法。

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


【解决方案1】:

来自docs

  def up
    change_column_default :table_name, :status, 0
  end

  def down
    change_column_default :table_name, :status, nil
  end

【讨论】:

  • 我认为你的意思是写:table_name而不是:column_name作为第一个值。 change_column_default(table_name, column_name, default) public
【解决方案2】:

当您执行 db:migrate 时,“up”函数肯定会完成这项工作。
但是在未来,在某些情况下,比如回滚,您可能需要一个函数来逆转这种特定的迁移。

def up
  change_column_null :people, :name, true
end

def down
  change_column_null :people, :name, false
end

【讨论】:

  • 虽然这段代码可能会回答这个问题,但最好解释一下它是如何解决问题的以及为什么要使用它。从长远来看,纯代码的答案没有用处。
  • 你能不能也补充一下,和this answer有什么区别?
  • that answer 指的是更改列的默认值。我的答案设置此列是否允许空值。
  • @TobiasLiefke 因为这个答案是唯一正确的答案,即使是 7 年后也是如此。它解决了这个问题,去掉了与列默认值无关的 NOT NULL 约束
  • @RyanRomanchuk 我在没有文字的时候添加了我的评论。如果我现在删除它,ran632s 的评论就没有意义了。答案仍然缺少您刚刚提供的信息。例如,请参阅 ddebruler 和 Rick Smith 的答案:总是解释,为什么这段代码可以解决问题。
【解决方案3】:

听起来您不是在尝试更改列的默认值,而是删除 NOT NULL 约束并允许空值(即从“null:false”更改为默认值“null:true”) .如果是这样,那么你可以使用change_column_null

class ChangeNameNull < ActiveRecord::Migration
  def change
    change_column_null :people, :name, true
  end
end

编辑 1:- 修正错字

【讨论】:

    【解决方案4】:
    def change
      change_column_null(:users, :admin, false, <put a default value here> )
      # change_column(:users, :admin, :string, :default => "")
    end
    

    将其中包含 NULL 值的列更改为不允许 NULL 会导致问题。这正是可以在您的开发设置中正常工作的代码类型,然后在您尝试将其部署到 LIVE 生产环境时崩溃。您应该首先将 NULL 值更改为有效的值,然后 然后 不允许 NULL。 change_column_null 中的第 4 个值正是这样做的。详情请见documentation

    另外,我通常更喜欢为字段设置默认值,这样我就不需要在每次创建新对象时都指定字段的值。我也包含了注释掉的代码来执行此操作。

    【讨论】:

      猜你喜欢
      • 2011-08-06
      • 1970-01-01
      • 2018-09-22
      • 2016-07-12
      • 1970-01-01
      • 2018-09-23
      • 2020-12-08
      • 2012-03-06
      • 2022-01-14
      相关资源
      最近更新 更多