0

我正在使用 MongoDB 作为我的项目的后端,但我并不特别希望在项目的生命周期中依赖 Mongo,以防我以后决定更改它,或者如果没有数据库的情况下单元测试更容易。然而,正如所写,我的控制器严格依赖于 MongoDB。

主要取自MongoDB 教程,我在一个config/initializers/mongo.rb文件中有以下内容。

MongoMapper.connection = Mongo::Connection.new('localhost')
MongoMapper.database = 'database'

if defined?(PhusionPassenger)
   PhusionPassenger.on_event(:starting_worker_process) do |forked|
     MongoMapper.connection.connect if forked
   end
end

在用于查询美国各州的控制器中,我有以下代码:

class StateController < ApplicationController
    def index
        states = MongoMapper.connection.db('database').collection('state').find()

        render :json => states
    end
end

我马上就看到了一些问题(可能还有更多):

  1. 如前所述,控制器对 MongoDB 有硬依赖。
  2. 我没有使用databaseMongoMapper 类的属性(它在控制器中硬编码)。
  3. 每次我想要引用状态集合时,我不一定要通过 HTTP 端点——尽管我想保持这个选项可用。例如,如果注册页面有一个下拉列表供用户选择他们的家庭状态,那么要求客户端 jQuery.get() 填充状态列表似乎是愚蠢的。在我看来,在服务器端预先获取状态并在服务器上构建下拉列表会更有意义。

对于#3,我当然可以在任何呈现需要状态列表的视图的操作方法中查询状态并将它们保存在@states(或类似的东西)中,但这将是很多重复的代码。

构建它以减少耦合和更多代码重用的最佳方法是什么?

4

1 回答 1

1

首先,您应该有一个状态模型:

class State
  include MongoMapper::Document
end

然后,在您的控制器中,您应该通过以下方式访问:

class StatesController < ApplicationController
  def index
    render :json => State.all
  end
end

这样,您的控制器就不知道它正在使用什么底层数据存储。

最后,为了减少进行 HTTP 调用的需要,但假设您使用 javascript 构建它,您编写以下代码:

<div id="#states" data-states="<%= @states.to_json %>"></div>

然后从$("#states").data("states")

于 2012-06-12T01:00:50.700 回答