3

我有 3 个支持我的 Rails 3.2 应用程序的大型只读数据库,其中的值被检查,其中一些与辅助信息一起存储在我的主数据库中。我将这些设置为我的开发和生产 Postgres 数据库中的模式。

这是错误的方法吗?由于它们只是只读的,有没有更好的方法让它们存在于自己的 Postgres 数据库中并从那里引用它们?我不认为 PG gem 是这样工作的。

如果它们确实需要在每个环境中,我如何确保它们是我的测试环境的一部分?

我不能只是将这些环境复制到test,每次我运行它们都会受到打击:

rake db:test:prepare
4

1 回答 1

1

如果我理解正确:

  • 您拥有 3 个带有支持数据的大型数据库,这对于运行您的应用程序至关重要
  • 由于它们很大,您不想将它们存储为 XML/JSON/序列化文件,并且您更喜欢将它们放在数据库中以便于查询
  • 您希望能够在所有环境和服务器中访问相同的 3 个数据库

所以你在这里所拥有的基本上是与源代码配置相提并论的东西,理想情况下应该是你的代码库的一部分。即它是一个fixture,虽然是一个数据库夹具,而不是一个 YAML 或 JSON 夹具。

理想的解决方案是,您应该将该数据库转储转换为固定装置。方法如下:

  • 对数据进行PostgreSQL 备份,并将其另存为test/fixtures/your_model_name.dmp
  • 创建一个新的 ERB 夹具test/fixtures/your_model_name.erb。ERB 夹具可以有 Ruby 代码
  • 在 ERB 夹具中添加以下代码:

    <%
      cfg = YourModel.connection_config
      FileUtils.sh "psql " +
                   "-u #{cfg['username']} " +
                   "-p #{cfg['password']} " + 
                   "-h #{cfg['host'] || 'localhost'} " +
                   " < #{Rails.root + '/test/fixtures/yourmodel.dmp'}"
    %>
    

由于它是 ERB 文件,它会自动运行其中的代码并将数据导入 PostgreSQL。唯一的问题是你需要psql在你的道路上。如果您的应用服务器和数据库位于不同的位置,那么您需要通过 ssh 连接到服务器,然后运行导入。

另一种选择是将这些数据库直接保存为 SQLite 文件,然后单独为这 3 个模型使用单独的连接。除非您的主应用程序表和这 3 个表之间没有任何直接的外键引用和 RESTRICT/CASCADE 定义,否则这会更广泛地工作。但我猜你的主数据库和这 3 个数据库之间已经没有直接关系,因为在大多数情况下,跨数据库引用很难处理。

于 2013-06-22T10:41:54.077 回答