Как псевдоним метода класса в модели rails?

Я хочу использовать метод класса на одной из моих моделей Rails.

  def self.sub_agent
   id = SubAgentStatus.where(name: "active").first.id
   where(type: "SubAgent",sub_agent_status_id: id).order(:first_name)    
  end

Если это был метод экземпляра, я просто использовал бы alias_method, но это не работает для методов класса. Как я могу это сделать без дублирования метода?

Ответ 1

Вы можете использовать:

class Foo  
   def instance_method       
   end  

   alias_method :alias_for_instance_method, :instance_method

   def self.class_method
   end  

   class <<self  
     alias_method :alias_for_class_method, :class_method
   end  
 end  

ИЛИ Попробуйте:

self.singleton_class.send(:alias_method, :new_name, :original_name)

Ответ 2

Я могу подтвердить, что:

class <<self
  alias_method :alias_for_class_method, :class_method
end

отлично работает, даже если он унаследован от базового класса. Спасибо!

Ответ 3

Чтобы добавить метод экземпляра в качестве псевдонима для метода класса, вы можете использовать delegate :method_name, to: :class

Пример:

class World
  def self.hello
    'Hello World'
  end

  delegate :hello, to: :class
end

World.hello
# => 'Hello World'
World.new.hello
# => 'Hello World'

Ссылка на документацию

Ответ 4

Быстрое напоминание, которое могло бы привести меня к правильному поведению немного быстрее, состоит в том, что этот alias_method должен произойти как последняя вещь в вашем определении class.

class Foo
  def self.bar(parameter)
    ....
  end

  ...

  singleton_class.send(:alias_method, :new_bar_name, :bar)
end

Удачи! ура

Ответ 5

class Foo

  def self.sub_agent
    id = SubAgentStatus.where(name: "active").first.id
    where(type: "SubAgent",sub_agent_status_id: id).order(:first_name) 
  end

  self.singleton_class.send(:alias_method, :sub_agent_new, :sub_agent)

end