9

我正在开发一个多数据库 Rails 3 应用程序。每个数据库都有不同的模式(并且在生产中位于不同的位置)。我已将应用程序设置为与不同的数据库对话,如下所示:

数据库.yml

development:
  adapter: mysql2
  encoding: utf8
  reconnect: false
  database: main_development
  pool: 5
  username: someuser
  password: somepassword
  socket: /tmp/mysql.sock

other_development:
  adapter: mysql2
  encoding: utf8
  reconnect: false
  database: other_development
  pool: 5
  username: someuser
  password: somepassword
  socket: /tmp/mysql.sock

模型/other_base.rb

class OtherBase < ActiveRecord::Base
  self.abstract_class = true
  establish_connection "other_#{Rails.env}"
end

模型/some_model.rb

class SomeModel < OtherBase
  # Regular stuff here
end

现在,这适用于 web 应用程序,但不适用于运行 rake 任务,包括测试(未正确加载夹具)。有没有可用的宝石?任何帮助表示赞赏。

此外,最好创建一个 schema.rb 文件,该文件可以处理不同数据库的不同模式 - 也就是说,将允许我执行 rake db:create 或 db:setup 之类的操作,并让它使用数据库创建多个数据库- 特定模式。

4

4 回答 4

4

在这种情况下,我发现环境的使用是不可接受的。您希望在同一环境中有两个数据库。

当我自己研究这个问题时,我遇到了 github 用户rafaelchiti的要点。不幸的是,他删除了原始要点。您可以在此处找到它的副本

于 2013-08-07T11:11:54.323 回答
1

我遇到了同样的问题,在花了半个小时寻找“loopy_multiple_database”插件后,最终得出结论,它已经从网络上消失了,并求助于猴子修补 Rails rake 任务。我想修复的唯一任务是db:migrate,但同样的(丑陋的)过程也可以让你修补其他任务。

在 Rails 3 上,添加创建一个文件db_migrate_override.rake(任何 *.rake 名称都可以),lib/tasks如下所示:

Rake::TaskManager.class_eval do
  def remove_task(task_name)
    @tasks.delete(task_name.to_s)
  end
end

def remove_task(task_name)
  Rake.application.remove_task(task_name)
end

namespace :db do
  remove_task 'db:migrate'
  desc "Migrate the database (options: VERSION=x, SRCDIR=path, VERBOSE=false)."
  task :migrate => :environment do
    srcdir = (ENV["SRCDIR"] || "db/migrate/")
    ActiveRecord::Migrator.migrate(srcdir, ENV["VERSION"] ? ENV["VERSION"].to_i : nil)
    Rake::Task["db:schema:dump"].invoke if (ActiveRecord::Base.schema_format == :ruby && ENV['SRCDIR'].nil?)
  end
end

然后你可以运行

rake db:migrate RAILS_ENV=other_development SRCDIR=db_other/migrate
于 2011-06-23T14:51:55.013 回答
1

您可以尝试使用 octopus gem ( https://github.com/thiagopradi/octopus ),它可以帮助您设置多个数据库,并且与 Rails 3.2 和 Rails 4 兼容。使用此 gem,您可以轻松指定您想要的数据库运行迁移。

于 2016-01-23T13:45:55.970 回答
0

您可以尝试循环多个数据库插件。它似乎允许轻松指定不同的 rake 配置

于 2011-02-23T14:14:52.323 回答