Расширить модель в плагине с помощью has_many, используя модуль - PullRequest
5 голосов
/ 05 октября 2009

У меня есть некоторый код в плагине в стиле движка, который включает некоторые модели. В моем приложении я хочу расширить одну из этих моделей. Мне удалось добавить методы экземпляра и класса к рассматриваемой модели, включив модуль из инициализатора.

Однако я не могу добавить ассоциации, обратные вызовы и т. Д. Я получаю ошибку «метод не найден».

/ ЛИЭС / QWERTY / core.rb

module Qwerty
  module Core
    module Extensions

      module User
        # Instance Methods Go Here 

        # Class Methods
        module ClassMethods
          has_many  :hits, :uniq => true # no method found

          before_validation_on_create :generate_code # no method found

          def something # works!
            "something"
          end
        end

        def self.included(base)
          base.extend(ClassMethods)
        end
      end
    end
  end
end

/ Инициализаторы / qwerty.rb

require 'qwerty/core/user'

User.send :include, Qwerty::Core::Extensions::User

Ответы [ 3 ]

14 голосов
/ 12 января 2011

Вы должны быть в состоянии сделать это. Немного более лаконично ИМХО.

module Qwerty::Core::Extensions::User
  def self.included(base)
    base.class_eval do
      has_many  :hits, :uniq => true
      before_validation_on_create :generate_code
    end
  end
end
6 голосов
/ 05 октября 2009

Я думаю, что это должно работать

module Qwerty
  module Core
    module Extensions
      module User
      # Instance Methods Go Here 

        # Class Methods
        module ClassMethods
          def relate
            has_many  :hits, :uniq => true # no method found

            before_validation_on_create :generate_code # no method found
          end

          def something # works!
            "something"
          end
        end

        def self.included(base)
          base.extend(ClassMethods).relate
        end
      end
    end
  end
end

Старый код неверен, потому что проверка и ассоциация вызываются при загрузке модуля, и этот модуль ничего не знает об ActiveRecord. Это общий аспект Ruby, код внутри тела класса или модуля вызывается непосредственно при загрузке. Вы этого не хотите. Чтобы обойти это, вы можете использовать вышеуказанное решение.

5 голосов
/ 31 октября 2012

В Rails 3 это звучит как хороший пример использования ActiveSupport :: Concern:

module Qwerty::Core::Extensions::User

  extend ActiveSupport::Concern

  included do
    has_many  :hits, :uniq => true
    before_validation_on_create :generate_code 
  end
end

class User
  include Querty::Core::Extensions::User
  # ...
end

Вот ActiveSupport :: Concern docs и самая полезная статья блога , которую я нашел.

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