【发布时间】:2015-04-18 23:09:41
【问题描述】:
我分离了我的模块,以便它们更易于阅读和搜索
lib
features
- running.rb
- walking.rb
features.rb
他们有
# lib/features/running.rb
module Features::Running
extend ActiveSupport::Concern
module ClassMethods
def can_run
...
end
end
end
另一个是:
# lib/features/walking.rb
module Features::Walking
extend ActiveSupport::Concern
module ClassMethods
def can_walk
...
end
end
end
有一天我可能会拥有很多这样的东西。
我的问题是当我想将它们添加到模型中时,我需要
# Sample model
class Man < ActiveRecord::Base
# Include features modules
include Features::Walking
include Features::Running
# Define what man can do
can_walk
can_run
end
我想知道是否有办法创建另一个模块并包含所有模块。比如:
# lib/features.rb
module Features
extend ActiveSupport::Concern
extend Features::Walking
extend Features::Running
end
所以我只需要添加
# Sample model
class Man < ActiveRecord::Base
# Include features modules
include Features
# Define what man can do
can_walk
can_run
end
或者我应该怎么做?
编辑 - 解决方案
我现在根据@Chris 解决方案得到了修复。我得到了这样的东西:
module Features
FEATURES = %w(running walking)
# include Features::Running
FEATURES.each do |feature|
send :include, "Features::#{feature.camelize}".constantize
end
module ClassMethods
# include Features::Running::ClassMethods
FEATURES.each do |feature|
send :include, "Features::#{feature.camelize}::ClassMethods".constantize
end
end
def self.included(base)
base.send :extend, ClassMethods
end
end
我的其他功能模块现在是:
# lib/features/running.rb
module Features::Running
module ClassMethods
def can_run
...
end
end
end
# lib/features/walking.rb
module Features::Walking
module ClassMethods
def can_walk
...
end
end
end
编辑 - 更新解决方案
module Features
FEATURES = [Running, Walking]
# include Features::Running
FEATURES.each do |feature|
send :include, feature
end
module ClassMethods
# include Features::Running::ClassMethods
FEATURES.each do |feature|
send :include, feature::ClassMethods
end
end
def self.included(base)
base.send :extend, ClassMethods
end
end
【问题讨论】:
标签: ruby-on-rails ruby module