我的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方法吗?没有任何继承语法(<<)或包含语法怎么办?然后,我如何才能实现自己想要做的事情,并摆脱列表中不需要的这些方法?
您正在看到的许多(大多数?全部?)额外方法正在使用创建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] 删除。
我来说两句