Каковы преимущества и недостатки размещения методов ActiveRecord в модулях? - PullRequest
2 голосов
/ 17 января 2010

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

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 используются в модуле, а не непосредственно в классе (классах), к которому они принадлежат?

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

Ответы [ 2 ]

3 голосов
/ 17 января 2010

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

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

Наиболее очевидным недостатком является то, что ваш код, как написано, немного сложнее.Вы не можете использовать validates_presence_of в модуле напрямую, потому что он не наследуется от ActiveRecord::Base.(Предполагается, что Rails 3 облегчает выборочное расширение ваших собственных классов / модулей с помощью битов ActiveRecord-Functionality

Вместо этого вам нужно вызывать Active-Record-Methods в вашей моделикласс, когда ваша модель включена:

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

Итак, главный недостаток в том, что ваш код становится немного сложнее для чтения.

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

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

0 голосов
/ 17 января 2010

Этот код может быть общим для моделей (классов).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...