我正在尝试使用伟大的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
答案 0 :(得分:1)
您有三种选择(在我看来):
通过Rack和Rails应用程序(在config.ru中)安装Sinatra应用程序,然后它将能够访问与Rails应用程序相同的代码。
将数据库代码放入自己的库中,将其放入gem中,让两个应用程序都需要宝石。
将现有数据库包装在数据API中,该数据API不提供任何页面,只提供数据(这可能是您尝试使用Sinatra进行的操作)。直接从Rails应用程序访问数据库,并使其像任何其他客户端一样调用新API。
我认为选项2优于选项1,选项3优于选项2.如果我要转到选项3,那么我可能先做1,然后是2,然后是3,因为每个都可以使用上一个选项使其更容易。
我不确定我是否完全理解,但是,您必须重新编写验证。设计良好的数据库意味着某些验证应该已经以约束的形式存在,但并非总是如此。