为什么在迁移中使用null monkeypatch可以删除方法,但在Rails控制台中不能?

3

这种行为非常酷,因为它使编写“未来证明”的迁移变得容易,其中迁移内联定义模型类,以防将来从代码库中删除该类。但是它是如何工作的呢?

$ 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

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

你有没有看过缺失的方法是什么?你可以比较这两个方法数组。 - Mark Swardstrom
我确定来自ActiveRecord宏的实例方法,例如has_many是缺失的。我猜剩下的方法是在从ActiveRecord::Base继承的空类中定义时获得的。 - Gabe Kopley
1
我明白你在问什么。我相信在FrobulateUsers类中创建的User类实际上是FrobulateUsers::User。当你计算它的方法时得到了666。 - Mark Swardstrom
没错!唉。想要给出答案吗?;) - Gabe Kopley
1个回答

2
深入研究以下,这才是真正的类名...
class FrobulateUsers < ActiveRecord::Migration

  puts User.name

  class User < ActiveRecord::Base
  end

  puts User.name

end

输出

User
FrobulateUsers::User

注意,你可以把这个放在类的外面...

# 20150810221740_frobulate_users.rb

class User < ActiveRecord::Base
end

class FrobulateUsers < ActiveRecord::Migration

  puts User.name

end

输出

User

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接