使用模块使用“has_many”扩展插件中的模型

时间:2009-10-05 11:00:00

标签: ruby-on-rails ruby

我在引擎样式插件中有一些代码,其中包含一些模型。在我的应用程序中,我想扩展其中一个模型。我已经设法通过在初始化程序中包含一个模块,将实例和类方法添加到相关模型中。

但我似乎无法添加关联,回调等。我收到'找不到方法'错误。

/libs/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

/initializers/qwerty.rb

require 'qwerty/core/user'

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

3 个答案:

答案 0 :(得分:14)

你应该能够做到这一点。更简洁的恕我直言。

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

答案 1 :(得分:6)

我认为这应该有用

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的一般方面,类或模块体内的代码在加载时直接调用。你不希望这样。为了解决这个问题,您可以使用上述解决方案。

答案 2 :(得分:5)

在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和最有帮助的blog article