Наиболее очевидным преимуществом является то, что вы можете использовать общие функции и помещать их в одно место. Это всего лишь общее преимущество сохранения вашего кода организованным и модульным (не предназначен для каламбуров) - и вы должны, конечно, это делать
Использование методов 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, который работает на повторном открытии классов.
С другой стороны, если вам нужно больше функциональных возможностей, например параметров конфигурации для вашего расширения, рассмотрите это как
Это не работает так, как написано: 'Module' должен быть' module' (строчный) и 'has_many' является не определены для модулей. вероятно, должно быть: 'def included (other); other.send (: has_many,: books); end' – levinalex
Обновленный код, спасибо levinalex. – Laz