Ruby on rails 将ActiveRecord方法放入模块的优点和缺点是什么?

Ruby on rails 将ActiveRecord方法放入模块的优点和缺点是什么?,ruby-on-rails,activerecord,module,Ruby On Rails,Activerecord,Module,创建以下模块的优点和缺点是什么: module Section def self.included(base) base.class_eval do has_many :books end end def ensure_books return false if books <= 0 end end 模块部分 def自带(基本) 基本类\u评估do 你有很多书吗 结束 结束 def保证书 如果书籍此代码可以由模型(类)共享,则返回fa

创建以下模块的优点和缺点是什么:

module Section
  def self.included(base)
    base.class_eval do
      has_many :books
    end
  end

  def ensure_books
    return false if books <= 0
  end
end
模块部分
def自带(基本)
基本类\u评估do
你有很多书吗
结束
结束
def保证书

如果书籍此代码可以由模型(类)共享,则返回false。

最明显的优点是,您可以将共享的功能放在一个地方。这只是保持代码组织化和模块化的一个普遍优势(没有双关语)——当然,您应该这样做

使用活动记录方法不会使这些模块以任何方式变得特殊

最明显的缺点是编写的代码有点复杂。您不能直接在模块中使用
验证
的存在,因为它不是从
ActiveRecord::Base
继承的。(3号轨道应该是

相反,当包含模型时,需要在模型类上调用活动记录方法:

module FooHelper
  def self.included(other)
    other.send(:has_many, :foos)
  end
end
因此,主要的缺点是代码变得更难阅读

如果您只是将单个类拆分为单独的部分,并且不需要在其他地方重用代码,那么可以使用通过重新打开类来工作的


另一方面,如果您需要更多的功能,比如扩展的配置参数,请考虑

这不符合编写:<代码>模块<代码>需要<代码>模块<代码>(小写)和<代码> HasyObjult没有为模块定义。可能需要:<代码> DEF包含(其他);;end
更新了代码,谢谢levinalex。您是否关心将模型上的关系隐藏到模块中?一般来说:不,如果您正确命名,以便模块的功能显而易见。将功能拆分为逻辑命名、经过良好测试的部分要比到处重复相同的代码好得多将所有代码保存在一个巨大的文件中