2016-12-21 5 views
1

я противостоял против выбора либо # 1:рубин как делегировать модуль функции пространства имен в пространство имен :: Base внутренний класс

class Abstract 
end 
class Abstract::Foo < Abstract 
end 
class Abstract::Bar < Abstract 
end 

против # 2:

module Abstract 
    class Base 
    end 
    class Foo < Base 
    end 
    class Bar < Base 
    end 
end 

Я в конечном итоге выбор опции # 2, так как мой Abstract чувствовал себя как пространство имен, и я мог бы в конечном счете добавить другие вещи, как

module Abstract # Instead of class if I had used option #1 
    class SomeAbstractService 
    end 
end 

Однако я чувствую, что вызов Abstract::Base.some_class_method немного странный. можно добавить делегирование функции модуля? Например, если мой Base является модель ActiveRecord или Mongoid (так Foo и Bar, как ИППП), я хотел бы иметь возможность запрашивать сбор/таблица

Abstract.where(...) вместо Abstract::Base.where(...)

Можно делегировать функцию модуля .where константе/классу Base?

Что-то вроде

module Abstract 
    class Base 
    end 

    delegate_module_function :where, to: :Base 
end 

Или есть другой/лучший способ сделать это?

ответ

3

Вы можете использовать стандартную библиотеку Ruby под названием Forwardable.

require 'forwardable' 

module Abstract 
    extend SingleForwardable 
    class Base 
    def self.where(p) 
     "where from base : #{p}" 
    end 
    end 

    delegate :where => Base 
end 

Abstract.where(id: 3) 
# => "where from base : {:id=>3}" 

Для нескольких методов, вы можете написать:

delegate [:where, :another_method] => Base 
+2

этом. Модули и классы - это объекты, подобные любому другому объекту, в этом нет ничего особенного. Вы должны делегировать методы между ними точно так же, как вы делегируете методы между любыми двумя другими объектами, потому что они * являются * просто любыми другими объектами. –

 Смежные вопросы

  • Нет связанных вопросов^_^