为什么 null monkeypatch 删除迁移中的方法而不是 rails 控制台中的方法?

Why does null monkeypatch remove methods in migration but not in rails console?

这种行为非常酷,因为它可以轻松编写 "futureproof" 迁移,其中迁移定义内联模型 class,以防 class 稍后从代码库中删除。但它是如何工作的?

$ rails c
pry(main)> User.methods.count
=> 686
pry(main)> class User < ActiveRecord::Base; end
=> nil
pry(main)> User.methods.count
=> 686

这是一个迁移:

class FrobulateUsers < ActiveRecord::Migration
  puts User.methods.count

  class User < ActiveRecord::Base
  end

  puts User.methods.count
  ...
end

当我 运行 它时:

$ rake db:migrate
687
666

为什么方法在迁移中消失了,而在控制台中却没有?

乱七八糟的,这才是真正的 class 名字...

class FrobulateUsers < ActiveRecord::Migration

  puts User.name

  class User < ActiveRecord::Base
  end

  puts User.name

end

输出

User
FrobulateUsers::User

注意,你可以把它放在 class...

的外面
# 20150810221740_frobulate_users.rb

class User < ActiveRecord::Base
end

class FrobulateUsers < ActiveRecord::Migration

  puts User.name

end

输出

User