迁移后尝试将列更改为“null:true”未反映在架构中

Lig*_*lue 3 activerecord ruby-on-rails

我有一个列/外键,resolver_id我希望能够拥有空值(即:Rails 迁移使列成为空 => true)。假设我的迁移中有以下行:

def
    change_column_null :bugs, :resolver_id, true
end
Run Code Online (Sandbox Code Playgroud)

但是,在运行成功迁移后(即生成迁移并运行rails db:migrate),除了版本号外,架构保持不变:

t.integer "resolver_id"

而我期待:

t.integer "resolver_id" , null: true

有什么我想念的吗?

我也试过change_column像这样使用:

change_column :bugs, :resolver_id, :integer, null: true

但是,这仍然没有反映在架构中。在rails g migrationdb:migrate模式中的工作蛮好的,版本号相匹配的最新迁移。

作为参考,这是我的架构:

ActiveRecord::Schema.define(version: 20170502203934) do

  create_table "bugs", force: :cascade do |t|
    t.string   "name"
    t.text     "error_msg"
    t.text     "description"
    t.text     "causes"
    t.boolean  "resolved"
    t.datetime "created_at",  null: false
    t.datetime "updated_at",  null: false
    t.integer  "user_id"
    t.integer  "resolver_id"
    t.index ["resolver_id"], name: "index_bugs_on_resolver_id"
    t.index ["user_id"], name: "index_bugs_on_user_id"
  end

  create_table "users", force: :cascade do |t|
    t.string   "username"
    t.string   "first_name"
    t.string   "last_name"
    t.string   "email"
    t.datetime "created_at",      null: false
    t.datetime "updated_at",      null: false
    t.string   "password_digest"
    t.index ["email"], name: "index_users_on_email", unique: true
    t.index ["username"], name: "index_users_on_username", unique: true
  end

end
Run Code Online (Sandbox Code Playgroud)

如果相关,resolver_id外键是用户模型的引用,即:

class Bug < ApplicationRecord
  # Associations
  belongs_to :user
  belongs_to :resolver, class_name: 'User'
end
Run Code Online (Sandbox Code Playgroud)

mea*_*gar 5

null: true是默认行为。你永远不会在你的模式中看到它,你要么看到要么null: false什么都不看到。