Rails系统重构:从单一复杂系统到多个小应用集群
2010-10-09 08:15:34 来源:WEB开发网示例程序
示例程序是一个简单的在线学习系统,用户在线购买和学习课程。按照业务逻辑将系统拆分成四个应用,分别用于课程信息管理(course)、用户注册登录及帐号管理(user)、订单系统(purchase)以及在线学习系统(learning)。这几个Rails应用中各自业务的实现比较简单,不再赘述。
查看原图(大图)
只读数据库
在示例程序中,用户需要购买课程后才能开始学习。由于我们对系统进行了拆分,订单和课程在两个不同的应用中进行管理,而用户下定单时需要查看课程列表,这就涉及到一个应用(purchase)如何获取另一个应用(course)数据的问题。
最直观的做法是course提供一个service,purchase调用这个service来取得课程列表。但service调用效率比较低,代码处理也比较复杂,所以应该尽量避免使用。我们仔细分析一下这个需求就会发现,在purchase显示的课程列表逻辑上很简单,只需要知道课程的名称、价格等基本属性就足够了,所以可以考虑直接从数据库读取这些信息。
由于系统拆分后每个应用都有独立的数据库,所以我们需要给purchase中的Model类设定指向course的数据库连接。代码如下:
# purchase: /app/models/course_package.rb:
class CoursePackage < ActiveRecord::Base
acts_as_readonly :course
end
这样CoursePackage除了数据库指向不同外,其他和普通的Model一样。
# purchase: /app/views/orders/new.erb.html
<ul>
<% CoursePackage.all.each do |package| %>
<li><%= package.title %> <%= package.price %></li>
<% end %>
</ul>
更多精彩
赞助商链接