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

Retrieve list of instance methods that are defined in rails class excluding inherited and included methods

我的 rails 项目中有一个 class 产品,我正在尝试检索文件中定义的 class 的实例方法列表(不是继承方法或通过 mixin 包含)。这是我的 class 的一小部分示例:

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)。然而,这仍然 returns 很多我不需要的方法,这里有一个小例子: :_run_post_process_callbacks, :aliased_fields, :_post_process_callbacks, :_run_image_post_process_callbacks, :_image_post_process_callbacks, :_validation_callbacks, :nested_attributes?, :_run_touch_callbacks, :readonly_attributes?, :_run_save_callbacks, :aliased_fields?, :_save_callbacks, :localized_fields?, :readonly_attributes, :领域?, :pre_processed_defaults?, :_update_callbacks, :post_processed_defaults?, :领域, :_id_default

我 运行 Product.new.method(:_run_post_process_callbacks).source_location 了解其中的一些方法,以尝试检查它们的来源。好像都来自active_support。 我从未在我的 class 中包含 active_support,所以我猜想 classes 在 rails 项目中自动包含 active_supports 方法?如果没有任何继承语法 (<<) 或包含语法,这怎么可能? 我怎样才能实现我想做的事情并摆脱我列表中不需要的这些方法?

您看到的许多(大部分?全部?)额外方法是使用 Module#define_method 创建的。如果您深入挖掘 active_support 的源代码,您会看到这一点。 (您没有直接包含 active_support,而是被一个或多个 Mongoid 模块引入。)

所以这些实际上是您的模型 class 的有效实例方法,这就是它们包含在 instance_methods(false) 中的原因。 "conventionally" 中定义的其他方法,例如 #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