0

我正在试验很棒的 Sinatra 环境来实现一个 json API 服务器,该服务器从“遗留”数据库(一个现有的数据库,已经在生产中)访问数据。

我正在使用 sinatra-activerecord gem 来访问我的数据。就像在 Sinatra 应用程序中包含简单的 decalration 一样简单:

class Exam < ActiveRecord::Base
end

我也喜欢 tux(相当于 rails 控制台)来查询我的模型(表)。

现在,在通过 API 调用插入新记录的情况下,我对下面解释的两种不同场景有架构上的疑问(假设是 POST 客户端请求创建/更新记录):

场景 1. 作为(我的)Rails 项目的一部分的现有数据库,已经在生产中

假设我的生产数据库(postgresql 实例)是我自己开发的 Rails 项目的一部分,所以我的 Activerecord 模型 .rb 代码包含相当复杂的验证方法;例如,上面提到的模型exam.rb由一千行一些复杂的正则表达式验证方法组成......

在那种情况下,避免模型源代码重复(以及可能的不匹配错误)的最佳技术解决方案是什么?我必须在 Sinatra 应用程序中做一个 OS 符号链接到原始 Rails 模型exam.rb ...?

场景2.别人开发的现有DB

所以假设我可以访问数据库表,但我没有任何关于应用数据“验证”的源代码(可能是用 Java 开发的,或者由于某些原因我无法访问的任何代码......)

在那种情况下,我认为方法是在 ruby​​-activerecord 中重写验证;正确的 ?

对不起我的长帖

giorgio about.me/solyaris

4

1 回答 1

1

场景 1. 作为(我的)Rails 项目的一部分的现有数据库,已经在生产中

你有三个选择(在我看来):

  1. 通过 Rack 和 Rails 应用程序(在 config.ru 中)安装 Sinatra 应用程序,然后它将能够访问与 Rails 应用程序相同的代码。

  2. 将数据库代码放入自己的库中,将其放入 gem 中,让两个应用程序都需要 gem。

  3. 将现有数据库包装在数据 API 中,该 API 不提供页面,只提供数据(这可能是您尝试对 Sinatra 执行的操作)。从 Rails 应用程序直接访问数据库,让它像任何其他客户端一样调用新的 API。

我相信选项 2 比选项 1 更好,选项 3 比选项 2 更好。如果我要转到选项 3,那么我可能会先做 1,然后是 2,然后是 3,因为每个人都可以使用前一个选项使其更容易。

场景2.别人开发的现有DB

我不确定我是否完全理解,但是是的,您必须重新编写验证。一个设计良好的数据库意味着一些验证应该已经以约束的形式存在,但并非总是如此。

于 2013-10-19T01:35:54.187 回答