【问题标题】:Why does null monkeypatch remove methods in migration but not in rails console?为什么 null monkeypatch 会删除迁移中的方法,但不会删除 rails 控制台中的方法?
【发布时间】:2015-08-10 21:55:37
【问题描述】:

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

$ 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

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

【问题讨论】:

  • 您是否查看过缺少哪些方法?可以比较两个方法数组。
  • 我确定缺少来自 ActiveRecord 宏(如 has_many)的实例方法。我猜剩下的方法是当你定义一个从 ActiveRecord::Base 继承的空类时得到的。
  • 我明白你在问什么。我相信在 FrobulateUsers 类中创建的 User 类实际上是 FrobulateUsers::User。当你得到 666 时,你计算它的方法。
  • 没错!卫生部。想要回答吗? ;)

标签: ruby-on-rails migration monkeypatching


【解决方案1】:

搞砸了,这才是真正的类名……

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-21
    • 1970-01-01
    • 2021-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多