Получить список методов экземпляра, определенных в классе rails, исключая унаследованные и включенные методы - PullRequest
0 голосов
/ 19 ноября 2018

У меня есть класс Product в моем проекте 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).Однако это по-прежнему возвращает много методов, которые мне не нужны, вот небольшой пример:aliased_fields ?,: _save_callbacks,: localized_fields ?,: readonly_attributes,: fields ?,: pre_processed_defaults ?,: _update_callbacks,: post_processed_defaults ?,: fields,: _id_default

1009 Product.new.method(:_run_post_process_callbacks).source_location 1009 *1009* 1009 *1009* 1007 *1009* 1009 *1009* 1009 *1009* 1009 *1009* 1009 *1009* 1009 *1009* 1009 *1009* 1009 *1009* 1009 *1009* 1009 *1009* 1009на некоторых из этих методов, чтобы попытаться проверить, откуда они берутся.Кажется, все они из active_support.Я никогда не включал active_support в свой класс, поэтому я предполагаю, что классы в проекте rails автоматически включают методы active_supports?Как это возможно без какого-либо синтаксиса наследования (<<) или включения синтаксиса?Как я могу тогда добиться того, что я хочу сделать, и избавиться от этих методов, которые мне не нужны в моем списке? </p>

1 Ответ

0 голосов
/ 19 ноября 2018

Многие (большинство? Все?) Из тех дополнительных методов, которые вы видите, создаются с использованием 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
...