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

时间:2018-11-19 13:24:40

标签: ruby-on-rails ruby inheritance mixins activesupport

我的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,  :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,  :fields ?,  :pre_processed_defaults ?,  :_update_callbacks,  :post_processed_defaults ?,  :fields,  : _id_default

我对其中的一些方法运行了Product.new.method(:_run_post_process_callbacks).source_location,以尝试检查它们的来源。似乎它们都来自active_support。 我从未在类中包含active_support,因此我猜想Rails项目中的类会自动包含active_supports方法吗?没有任何继承语法(<<)或包含语法怎么办? 然后,我如何才能实现我想做的事情,并摆脱列表中不需要的这些方法?

1 个答案:

答案 0 :(得分:2)

您正在使用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