代码之家  ›  专栏  ›  技术社区  ›  David Geismar

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

  •  1
  • David Geismar  · 技术社区  · 6 年前

    我的rails项目中有一个类产品,我试图检索在我的文件中定义的类的实例方法列表(不是继承的方法或通过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) . 但是,这仍然返回许多我不需要的方法,下面是一个小示例: :别名_字段, :_post_process_回调, :_run_image_post_process_回调, :_image_post_process_回调, :嵌套的_属性?, :_run_touch_回调, :别名_字段?, :本地化的_字段?, :字段?, :预处理\u默认值?, :字段, :

    Product.new.method(:_run_post_process_callbacks).source_location 在这些方法中的一些上尝试检查它们来自哪里。看来他们都来自积极的支持。 我从来没有在我的类中包含active_支持,所以我猜rails项目中的类会自动包含active_支持方法吗?如果没有任何继承语法(<<)还是包括语法? 那么,我如何才能实现我想做的事情,并摆脱我列表中不需要的这些方法呢?

    1 回复  |  直到 6 年前
        1
  •  2
  •   showaltb    6 年前

    很多(大多数)?所有这些额外的方法都是使用 Module#define_method active_support 积极支持 ,但它被一个或多个 Mongoid 模块。)

    instance_methods(false) #freeze instance_methods(true) ,但不是由 实例_方法(false)

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

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