如何在Ruby中使用方法包含模块?

时间:2014-01-28 13:13:27

标签: ruby-on-rails ruby module include gem

我有这个模块是我写作的宝石的一部分。我目前使用它如下:

gem 'foobar' # Gemfile

class Baz < ActiveRecord::Base
  include Foo::Bar
  say
end

module Foo
  module Bar
    module ClassMethods
      def say
        "hello"
      end
    end

    extend ClassMethods
  end
end

要使say正常工作,我必须在调用之前include Foo::Bar。无论如何在没有先包含模块的情况下调用say? (它有没有为我做包括?)我看到其他宝石只是神奇地添加方法到类而不使用include - 只需添加gem和运行bundle。这是怎么发生的?

1 个答案:

答案 0 :(得分:1)

如果您希望say方法是通用的而不是特定于对象,请将其设为类方法:

module Foo
  module Bar
    def self.say
      "hello"
    end
  end
end

然后你可以直接调用它:

class Baz < ActiveRecord::Base
  Foo::Bar.say
end

编辑:要回答您的新问题(关于gem),您可以重新打开ActiveRecord::Base类并在那里定义方法,尽管使用单独的模块执行此操作是最好的方法(清洁和语义正确)。