检索rails类中定义的实例方法的列表,不包括继承的和包含的方法



我的rails项目中有一个类Product,我正在尝试检索文件中定义的类的实例方法列表(不是继承的方法或通过mixin包含的方法(。这是我班的一个小样本:

class Product
include Mongoid::Document
include Mongoid::Paperclip
include Mongoid::Search
include Mongoid::Slug
include Mongoid::Timestamps
extend Enumerize
def product_image
image.url(:small) unless image.nil?
end
def product_school_level
self.school_levels.join ' | '
end
def product_grades
self.grades.where(degree_ids: nil).pluck(:name).uniq.join ' | '
end
end

我尝试使用Product.instance_methods(false)。然而,这仍然返回了许多我不需要的方法,这里有一个小示例::_run_post_process_callbacks,:别名字段,:_post_process_callbacks,:_run_image_post_process_callbacks,:_image_post_process_callbacks,:_validation_callbacks,:nested_attributes?,:_run_touch_callbacks,:只读属性?,:_run_save_callbacks,:aliased_fields?,:_save_callbacks,:localized_fields?,:只读属性,:字段?,:预处理默认值?,:_update_callbacks,:post_processed_defaults?,:字段,:_id_default

我在其中一些方法上运行了Product.new.method(:_run_post_process_callbacks).source_location,试图检查它们的来源。它们似乎都来自active_support。我从未在类中包含active_support,所以我想rails项目中的类会自动包含active_ssupports方法?如果没有任何继承语法(<<(或include语法,这怎么可能呢?然后我如何才能实现我想做的事情,并摆脱清单中不需要的这些方法?

您看到的许多(大多数?全部?(额外方法都是使用Module#define_method创建的。如果你深入挖掘active_support的源代码,你就会发现这一点。(您没有直接包含active_support,但它是由一个或多个Mongoid模块引入的。(

因此,这些实际上是模型类的有效实例方法,这就是它们包含在instance_methods(false)中的原因。混合蛋白中"传统"定义的其他方法,如#freeze,由instance_methods(true)报道,但instance_methods(false)没有报道。

我认为您可能需要做一些事情来根据源位置过滤列表。大致如下:

my_methods = Product.instance_methods(false).select do |m|
Product.instance_method(m).source_location.first.ends_with? '/product.rb'
end

最新更新