我有3个大型只读数据库支持我的Rails 3.2应用程序,因为它们中的值被检查,其中一些与辅助信息一起存储在我的主数据库中。我在开发和生产Postgres数据库时将这些设置为模式。
这是错误的做法吗?因为它们只是只读的,有没有更好的方法让它们存在于自己的Postgres数据库中并从那里引用它们?我不认为PG宝石就是这样的。
如果他们 需要在每个环境中,我怎样才能保证他们是我测试环境的一部分?
我不能将这些环境复制到test
,每次运行时都会受到影响:
rake db:test:prepare
答案 0 :(得分:1)
如果我理解得对:
所以你在这里所拥有的基本上与源代码或配置相同,理想情况下应该是你的代码库的一部分。即它是fixture
,虽然是数据库夹具而不是YAML或JSON夹具。
理想的解决方案是,您应该将该数据库转储转换为fixture。方法如下:
test/fixtures/your_model_name.dmp
test/fixtures/your_model_name.erb
。 ERB灯具可以有Ruby代码在ERB fixture中添加以下代码:
<%
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个模型use a separate connection。除非您的主应用程序表和这3个表之间没有任何直接的外键引用和RESTRICT / CASCADE定义,否则这种方法的工作范围更广。但是我猜你的主数据库和这3个数据库之间已经没有直接关系了,因为在大多数情况下跨数据库引用很难处理。