Sinatra API服务器通过Activerecord访问Preexistent数据库:关于验证

时间:2013-10-16 11:34:28

标签: ruby-on-rails database activerecord sinatra sinatra-activerecord

我正在尝试使用伟大的Sinatra环境来实现一个json API服务器,该服务器访问来自“遗留”数据库(现有数据库,已经在生产中)的数据。

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

class Exam < ActiveRecord::Base
end

我很享受tux(rails console等效),查询我的模型(表格)。

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

场景1.存在的数据库是(我的)Rails项目的一部分,已经在prod

假设我的生产数据库(postgresql实例)是我自己开发的Rails项目的一部分,所以我的Activerecord Models .rb代码包含非常复杂的验证方法;举例来说,上面提到的模型exam.rb包含了一些复杂的正则表达式验证方法......

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

场景2.由其他人开发的现有数据库

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

在那种情况下,我认为方法是在ruby-activerecord中重写验证;对吗?

对不起我的长篇文章

乔治 about.me/solyaris

1 个答案:

答案 0 :(得分:1)

场景1.存在的数据库是(我的)Rails项目的一部分,已经在prod

您有三种选择(在我看来):

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

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

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

  4. 我认为选项2优于选项1,选项3优于选项2.如果我要转到选项3,那么我可能先做1,然后是2,然后是3,因为每个都可以使用上一个选项使其更容易。

    场景2.由其他人开发的存在DB

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