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