2010-01-16 3 views
2

Каковы преимущества и недостатки создания модуля, как:Каковы преимущества и недостатки внедрения методов ActiveRecord в модули?

module Section 
    def self.included(base) 
    base.class_eval do 
     has_many :books 
    end 
    end 

    def ensure_books 
    return false if books <= 0 
    end 
end 

... где методы ActiveRecord используются в модуле, а не непосредственно от класса (ов) они принадлежат?

Должны ли модули использоваться для таких методов?

+0

Это не работает так, как написано: 'Module' должен быть' module' (строчный) и 'has_many' является не определены для модулей. вероятно, должно быть: 'def included (other); other.send (: has_many,: books); end' – levinalex

+0

Обновленный код, спасибо levinalex. – Laz

ответ

3

Наиболее очевидным преимуществом является то, что вы можете использовать общие функции и помещать их в одно место. Это всего лишь общее преимущество сохранения вашего кода организованным и модульным (не предназначен для каламбуров) - и вы должны, конечно, это делать

Использование методов Active Record не делает эти модули специальным любым способом.

Наиболее очевидным недостатком является то, что ваш код, как написано, немного сложнее. Вы не можете использовать validates_presence_of в модуле напрямую, потому что он не наследуется от ActiveRecord::Base. (Rails 3 предполагается make it easier to selectively extend your own classes/modules with bits of ActiveRecord-Functionality

Вместо этого, вам нужно позвонить в Active-RECORD-методы на вашей модели класса, когда ваша модель входит:

module FooHelper 
    def self.included(other) 
    other.send(:has_many, :foos) 
    end 
end 

Таким образом, главным недостатком является то, что ваш код становится немного труднее читать.

Если вы просто разбивая один класс на отдельные части и не необходимости повторного использования кода в другом месте, вы можете использовать concerned_with-pattern, который работает на повторном открытии классов.

С другой стороны, если вам нужно больше функциональных возможностей, например параметров конфигурации для вашего расширения, рассмотрите это как

+0

Будете ли вы относиться к отношениям на моделях, скрытых в модулях? – Laz

+0

в целом: нет, если вы получите право наименования, чтобы было очевидно, что делает модуль. Имея функциональность, разделенную на логически названные, хорошо проверенные части намного лучше, чем повторять один и тот же код повсюду или иметь весь код в одном гигантском файле – levinalex

0

Этот код может использоваться другими типами (классами).

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