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

大卫·盖斯玛(David Geismar)

我的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_attributess,:_run_attributes ?、:_run_attributes? 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方法吗?没有任何继承语法(<<)或包含语法怎么办?然后,我如何才能实现自己想要做的事情,并摆脱列表中不需要的这些方法?

Showaltb

您正在看到的许多(大多数?全部?)额外方法正在使用创建Module#define_method如果您深入了解的源代码active_support,将会看到。(您没有直接包含active_support,但已被一个或多个Mongoid模块插入。)

因此,这些实际上是模型类的有效实例方法,这就是为什么将它们包含在中的原因instance_methods(false)在mixin中“常规”定义的其他方法,例如#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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

对象在列表理解中不包括方法

如果不包括类/模块,则仅允许模块定义方法

Lua继承不包括元方法吗?

在C ++中包括头文件(类定义和方法实现)

验证中的Rails 4调用方法不包括

列出给定类的所有方法,不包括 Python 中父类的方法

动态定义相关的类和实例方法

Ruby / Rails元编程,如何动态定义实例和类方法?

在类中包含或继承模块的几种方法

Python中的类继承,超级方法和重写方法

Sparql 1.1获取特定类的所有实例,但不包括子类中的任何实例

在Rails控制台中定义类(实例)方法

方法链接和类继承

如何调用右侧定义的类中存在的方法。Python继承。多重继承。Dimond场景python继承

从继承类的模块定义的方法中调用super

该方法应在第1行的索引a和b之间打印包含a且不包括b的数组元素

静态方法和字段是否在其定义的类的实例中占用内存?

静态方法和字段是否在其定义的类的实例中占用内存?

如何定义一个方法,以便返回当前类的实例,而不是返回在Python中继承该类的实例的实例?

在包含对象类的当前实例中调用Java方法

Ruby on Rails实例与类方法

通过继承的静态方法创建继承类的新实例

继承类中的重载方法

如何通过FirebaseFirestore查询从类中的方法检索数据列表?

确定类明确实现的接口,不包括继承

Javascript继承静态和实例方法/属性

在Ruby类中定义类方法和属性的正确方法

在宏中定义类和方法

在类中定义数组的方法和字段