1

我想知道是否有人对这个问题有一些见解。

一点背景

我们一直在使用 Rails 从旧的 dBase 和基于 Visual Basic 的系统迁移,以构建内部公司 IntrAnet,它可以处理标签打印、库存控制、运输等 - 基本上是一个 ERP

困境

现在我们需要替换一个用 Java 完成的面向客户的旧网站,该网站将连接到我们的内部系统供客户使用。我们希望能够从我们的内部系统中提取库存、下订单、帐户报表等信息,并将其实时公开。原因是我们在网站上接受订单,通过传真和电话,有时我们有预约。因此,有时(非常罕见)即使是我们旧 Java 网站上库存更新的短暂延迟也会导致我们延期交货,因为我们在半小时内将同一商品卖给了 2 位客户。它通常会在一天内修复,但我们希望将来避免这种情况。

实际问题

有人对如何以更好的方式完成此任务有任何建议吗?

以下是我看到的三个选项:

a) 在 Web 服务器上构建一个单独的 Rails 应用程序,它将连接到我们内部应用程序连接到的同一个数据库。

  • +++ 优点:实时数据 - 与我们的内部应用程序看到的相同,即实时创建订单,库存立即耗尽

  • --- 缺点:潜在的安全风险、代码重复——即我需要复制所有处理订单的控制器、模型、视图等。

b) 在 Web 服务器上构建一个单独的 Rails 应用程序,它将连接到与我们内部应用程序不同的数据库。

  • +++ 优点:更少的安全风险。
  • --- 缺点:同步网络数据库和内部数据库(或使用像 REST-API 之类的网络服务)的额外工作,处理库存耗尽和订单创建的额外代码,代码重复 - 即我需要复制所有控制器,处理订单的模型、视图等。

c) 向网络公开内部应用程序

  • +++ 优点:消除了上面的所有问题。这是非常“干燥”的方法。
  • --- 缺点:更多的安全问题。更复杂的登录系统 - 一种用于 Web,另一种用于使用 LDAP 的内部用户。

那么有什么想法吗?有人有类似的问题要解决吗?请记住,我们公司的资源有限 - 即一位致力于此的开发人员。所以这必须是那些“正确”和“聪明”的解决方案之一,而不是“在这个解决方案上投入金钱/人员/资源”。

谢谢你。

4

5 回答 5

1

我会去一个。您应该能够创建控制器以便它们可重用。

内部用户与外部用户一样可能复制数据。

于 2009-12-01T16:43:05.563 回答
1

公共 UI 和内部的、为员工服务的 UI 可能需要有所不同。数据需要保持一致,所以我会付出相当多的努力来确保有一个确切的、权威的数据库。那么:一个数据库两个用户界面?

拥有两个 UI 都可以使用的“服务”层。如果这是 Java,我将非常有信心快速完成服务。我想知道在 Ruby/Rails 中它有多容易。

最好的结果是您现有的 Customer Java UI 可以适应使用 Rails 服务层。

于 2009-12-01T16:43:21.693 回答
1

我可能会为公共站点创建单独的控制器并使用 ActiveResource 从您的内部应用程序中提取数据。看一眼

http://blog.rubybestpractices.com/posts/gregory/rails_modularity_1.html

http://api.rubyonrails.org/classes/ActiveResource/Base.html

编辑 - 固定链接并添加 api 链接

于 2009-12-01T17:04:01.417 回答
1

假设你相信你的程序员不会不小心把东西暴露在错误的地方,“正确”的解决方案在我看来只有一个应用程序,但有两组不同的控制器和视图,一组供内部使用,另一组面向公众。这将为您提供 djna 的一个数据库、两个 UI 的概念。

正如您所说,拥有两个独立的数据库将涉及大量重复以及复制问题。

让两个完全独立的应用程序使用同一个数据库对我来说没有意义。Rails 应用程序的 ActiveRecord 部分是 Ruby 代码中数据库的抽象,因此对单个数据库进行两个抽象似乎有点错误。

然后,您还可以在模型中使用通用业务规则,以避免站点的两个版本之间的代码重复。

如果你不完全信任你的程序员,那么 Mike 的 ActiveResource 方法非常好——它会让意外暴露事情变得更加困难(尽管 ActiveResource 的灵活性和功能比 ActiveRecord 少得多)

于 2009-12-01T17:15:01.427 回答
1

你用的是什么版本的 Rails?由于包含 2.3 版 Rails 引擎,这允许在 Rails 插件中共享通用代码(模型/视图/控制器)。

有关简短介绍,请参阅Railscast

我也用它。我为不同的客户开发了三个应用程序,但所有共享代码都在一个插件中。

于 2009-12-02T08:34:45.643 回答