我有这个模块是我写作的宝石的一部分。我目前使用它如下:
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。这是怎么发生的?
答案 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
类并在那里定义方法,尽管使用单独的模块执行此操作是最好的方法(清洁和语义正确)。