为什么 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
这种行为非常酷,因为它可以轻松编写 "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