我们几年来一直在使用ActiveResource开展各种项目。如果您在客户端和服务器端都使用Rails,似乎ActiveResource很好用。
ActiveResource的问题
我们在服务器端使用Scala并且经常遇到“哦,ActiveResource不希望API到<do this standard thing>
”或“ActiveResource做<this weird thing>
”因此我们必须更改服务器,以支持客户端的需求。我知道这一切都已经讨论过了。
另一个问题是许多宝石和库需要ActiveRecord。我无法计算我们遇到的那些“需要”你的模型使用ActiveRecord的宝石的数量,即使他们实际上并没有使用实际的AR功能。这似乎主要是因为这是宝石开发的简单途径。 “我正在使用ActiveRecord,并且无法想象有人不使用它,所以我只需要而不是找出更通用的方式”(注意,我自己也做过,所以我不是简单的抱怨)
因此,如果我们使用ActiveResource,我们必须打破服务器以使其工作,并且我们不能使用Rails的大部分内容。
REST适配器?
所有这一切都让我们提出了一个问题“为什么ActiveResource一直存在?”我的意思是,为什么你会有这个辅助数据存储路径?为什么ActiveResource不是REST适配器?使用REST适配器,您可以拥有所有宝石中的所有好东西,而不必与ActiveResource的挑剔本质作斗争。您只需像构建任何模型一样构建模型。
所以我开始探索构建一个。它实际上似乎并不困难。几个小时的工作,你可以建立基本的功能。其他地方有使用REST和SOAP的例子,所以它是可行的。
所以问题又回来了。 如果它很容易,为什么以前没有这样做过?
不仅仅是数据存储区?
我想出了我想知道的答案。在为此建立脚手架时,我很快遇到了一个问题。 REST非常擅长做两件事:1)对这个对象采取行动,2)对所有对象采取行动。实际上,这几乎是REST标准的限制。
所以我开始怀疑范围是否是没有REST适配器的原因。 ActiveRecord子系统似乎需要的不仅仅是“获得一个”和“全部获得”。它基于查询数据存储区。
实际问题
所以,实际的问题:是否没有ActiveRecord REST适配器,因为REST没有标准化的方式来说“给我所有汽车与这些驱动器在同一个停车场的汽车,并且司机有钥匙。 “
答案 0 :(得分:0)
没错。
与将SQL作为表达条件的标准方式的数据库不同,REST中没有标准来支持所有ActiveRecord函数,例如连接,组和拥有。
您认为进行相关查询或子查询需要多少小时工作?
<小时/> 我不是在这里随便不屑一顾。这个概念涉及我考虑过的一些个人项目,还有一些我一直在考虑的相同问题。
ActiveRecord支持所有SQL,这比大多数人使用或需要的方式更强大。基本上,SQL语句的每个部分都有一个ActiveRecord方法,该方法接受一个字符串来填充SQL的那一部分。
您希望将客户端限制为人们实际使用的ActiveRecord部分。你仍然需要IS NULL,并且IS NOT NULL。你需要进行比较,比如小于和大于。你想支持OR语句,对于“field1 IS NULL OR field1 =''”。
要做所有的比较,比如where([“updated_at&gt;?”,cutoff]),你需要一个比现有Web服务更强大的RESTful服务器。服务器必须使用您的gem,或者使用指南来构建所有功能。
那么,到底为什么呢?您正在实现一个有限的数据库API,使用字符串URL而不是二进制数据包通过网络传输到您正在实现的数据库引擎。
答案 1 :(得分:0)
另一方面,如果有一个标准,这样的实施可能会有很好的好处。
如果有一个可以在RESTful Web服务器上安装的实现,虽然可能没有SQL那么强大,但可以进行索引查询,发布简单的非可索引表达式的索引处理以限定记录返回和排序, (即使将其传递给SQL数据库完成所有工作),也可以在服务器上启用此功能,并且可以开发Crystal Reports等产品以将该标准用于报表客户端。
通过Web服务器API层,可以提供一种方法来强制限制可以执行的数据库操作,以提供比完全打开数据库访问更多的安全性。此外,可以将逻辑添加到Web服务以审核并对CRUD操作产生的事件(基本上是触发器)进行处理。是的,数据库产品提供安全策略,触发器和存储过程来执行这些操作,但是对于我们正在讨论的产品,人们可以在ruby中更容易地使用数据库函数。
也可以有伪数据,这些伪数据是从ruby代码计算出来的,但就像数据库记录一样,与一般的DB RESTful访问一样。当然,数据库可以执行此操作来存储过程,有些支持使用Java编写存储过程,但这样会更好,因为它更容易实现并且可以用ruby编写。