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

标签 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

...ActiveRecord 方法在模块中的哪些位置使用,而不是直接在它们所属的类上使用?

模块应该用于这样的方法吗?

最佳答案

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

使用 Active Record 方法不会使这些模块以任何方式变得特殊

最明显的缺点是您编写的代码稍微复杂一些。您不能直接在模块中使用 validates_presence_of,因为它不是从 ActiveRecord::Base 继承的。 (Rails 3 应该 make it easier to selectively extend your own classes/modules with bits of ActiveRecord-Functionality

相反,当包含模型时,您需要在模型类上调用 Active-Record-Methods:

module FooHelper
  def self.included(other)
    other.send(:has_many, :foos)
  end
end

所以主要的缺点是你的代码变得有点难以阅读。

如果您只是将单个类分解为单独的部分,并且不需要在其他地方重用代码,则可以使用 concerned_with-pattern这是通过重新开课来实现的。

另一方面,如果您需要更多功能,例如扩展程序的配置参数,请考虑 writing a plugin

关于ruby-on-rails - 将 ActiveRecord 方法放入模块中的优点和缺点是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2078955/

相关文章:

sql - 我怎样才能让 Rails 5 与其中有一个句点的主键一起玩?

mysql - 带有 sinatra 和 activerecord mysql db 重复错误的 Ruby 没有作为异常引发

ruby-on-rails - rails View 中有多少代码是可以的?

ruby-on-rails - Rails - 使用相同的属性名称按日期分组返回不同的答案

ruby-on-rails - Rails请求统计信息gem?

ruby-on-rails - 如何对 add_column 进行可逆迁移

mysql - 如何将数据库记录存储到哈希 ruby​​ on rails

python - Python 模块和 Python 包有什么区别?

node.js - 如何一次更新所有 npm 包/模块?

object - 在我的所有 Node 应用程序上扩展 Object.prototype.myNewMethod