Active Model、Active Record和Active Resource之间的区别

71

有没有人能够帮助我定义Active Model、Active Record和Active Resource之间的确切区别呢?我已经做了足够的谷歌搜索,但没有找到任何确切的东西,可以告诉我它们之间的确切区别。目前它们看起来都一样。请给我一个适当的答案,并提供一些具体的要点。

3个回答

106

Rails 3是以模块化为设计思想的。每个模块都有其特定的目的和功能。

ActiveModel: 这个组件在Rails 3中创建。他们将Rails 2 ActiveRecord没有数据库要求的所有与model相关的部分移动到了ActiveModel中。因此,ActiveModel包括了像验证这样的功能。更多信息:http://www.rubyinside.com/rails-3-0s-activemodel-how-to-give-ruby-classes-some-activerecord-magic-2937.html

ActiveRecord: 这是将类关联到数据库的组件。它将为类提供一些功能,例如使从数据库检索记录变得容易的方法(例如find方法)。

ActiveResource: 类似于ActiveRecord。但是,ActiveResource对象不是由数据库支持,而是通过Web服务API由另一个应用程序支持。更多信息:http://ofps.oreilly.com/titles/9780596521424/activeresource_id59243.html

(无法确定ActiveBase是什么...你是从哪里听说的?)


感谢richardaday提供如此清晰明了的答案。很抱歉我用错了单词“ActiveBase”,应该是“ActiveRecord::Base”。你能告诉我这是什么吗?我知道Active record继承自它,但“ActiveRecord::Base”的实际用途是什么?如果可能,请也给我发送详细答案的链接。 - Arif Usman
1
ActiveRecord::Base 是 ActiveRecord。我认为你可能对语法感到困惑:ActiveRecord 是将实现其功能的多个类组合在一起的模块(例如,一个示例类是 Base)。http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_modules.html 和 http://api.rubyonrails.org/classes/ActiveRecord/Base.html - richardaday
O'Reilly的链接已经无法链接到它原来所链接的内容。 - Dennis
这是 O'Reilly 的存档链接:https://web.archive.org/web/20130522210633/http://ofps.oreilly.com/titles/9780596521424/activeresource_id59243.html - yagni
请在这个答案中添加ActiveRelationship。 - Anshul Riyal
请注意,ActiveRecord::Base(至少在Rails 6.0.3.2中)包含了所有ActiveModel子模块,包括ActiveModel::Model所包含的-- AttributeAssignmentConversionForbiddenAttributesProtectionModelValidationsValidations::HelperMethods -- 还有更多:AttributeMethodsDirtySecurePasswordSerializationSerializers::JSONValidations::Callbacks - David Moles

19

我的理解:

ActiveModel + 数据库支持 = ActiveRecord

通过 Web 服务 API 使用 ActiveModel = ActiveResource


8

ActiveModel https://github.com/rails/rails/tree/master/activemodel

想象一下一个需要不断验证的超级模型。

ActiveModel 可以用于许多事情,但最常用于为模型/数据库记录添加验证支持。


ActiveRecord https://github.com/rails/rails/tree/master/activerecord

将一个新类和数据库中的现有表之间建立映射关系。这里的“record”指的是表记录。

在应用程序中,这些类通常被称为模型。模型也可以与其他模型连接;这可以通过定义关联来实现。

  class Firm < ActiveRecord::Base
    has_many   :clients
    has_one    :account
    belongs_to :conglomerate
  end

在后台,Rails使用ActiveRecord进行模式管理和定义记录属性,充当ORM(对象关系映射器):

“ORM:将数据库表或视图中的行包装在对象中,封装数据库访问,并在该数据上添加领域逻辑。”

模式概述了记录的属性。

ActiveResource https://github.com/rails/activeresource

将资源看作 URL 中的 R 或驱动许多 Rails 后端的资源路由

允许您通过 HTTP 进行Create、Retrieve、Update 或 Destroy(CRUD)等操作。

  tyler = Person.find(1) 

当对资源路由发出请求时,RESTful 请求将其映射到相应的 HTTP 动词和数据库交互。
  GET    => Person.find(1)
  POST   => Person.new(:name => 'Tyler', :favorite_page => 'stackoverflow') 
  PUT    => tyler.save
  DELETE => tyler.destroy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接