检索 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
我的 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