我试图找到在调用Item.where(dst: "video")时调用的方法(item是mongoid模型)。在源代码中查找时,我发现criteria.rb是可以访问的地方但是,def where调用super然后Origin::Selectable(包含在Origin::Queryable中)定义它:

def where(criterion = nil)
   criterion.is_a?(String) ? js_query(criterion) : expr_query(criterion)
end

现在,我要看看js_queryexpr_query在哪里,看看他们在做什么等等。
浏览所有这些源代码和模块,找到所有方法,然后试图找出它是如何工作的,这会变得很困难。
有没有更好的方法来做这个过程,找出事情是如何工作的?

最佳答案

如果您知道接收者的类(比如A)和方法名(比如foo),则可以执行以下操作:

A.instance_method(:foo).source_location

在大多数情况下,它会给出文件名和行号如果它返回nil,那么它很可能是一个c定义的方法,它不依赖于其他ruby方法。
另一种方法是使用prygem或method_sourcegem。

10-07 12:04