Rails中的多个数据库连接

我正在使用active_delegate在Rails中进行多个连接。 这里我使用mysql作为master_database用于某些模型,而postgresql用于其他一些模型。

问题是,当我尝试访问mysql模型时,我收到以下错误! 堆栈跟踪显示,它仍然使用postgresql适配器来访问我的mysql模型!

RuntimeError: ERROR C42P01 Mrelation "categories" does not exist P15 F.\src\backend\parser\parse_relation.c L886 RparserOpenTable: SELECT * FROM "categories" STACKTRACE =========== d:/ruby/lib/ruby/gems/1.8/gems/activerecord-2.3.2/lib/active_record/connection_adapters/abstract_adapter.rb:212:in `log' d:/ruby/lib/ruby/gems/1.8/gems/activerecord-2.3.2/lib/active_record/connection_adapters/postgresql_adapter.rb:507:in `execute' d:/ruby/lib/ruby/gems/1.8/gems/activerecord-2.3.2/lib/active_record/connection_adapters/postgresql_adapter.rb:985:in `select_raw' d:/ruby/lib/ruby/gems/1.8/gems/activerecord-2.3.2/lib/active_record/connection_adapters/postgresql_adapter.rb:972:in `select' d:/ruby/lib/ruby/gems/1.8/gems/activerecord-2.3.2/lib/active_record/connection_adapters/abstract/database_statements.rb:7:in `select_all_without_query_cache' d:/ruby/lib/ruby/gems/1.8/gems/activerecord-2.3.2/lib/active_record/connection_adapters/abstract/query_cache.rb:60:in `select_all' d:/ruby/lib/ruby/gems/1.8/gems/activerecord-2.3.2/lib/active_record/connection_adapters/abstract/query_cache.rb:81:in `cache_sql' d:/ruby/lib/ruby/gems/1.8/gems/activerecord-2.3.2/lib/active_record/connection_adapters/abstract/query_cache.rb:60:in `select_all' d:/ruby/lib/ruby/gems/1.8/gems/activerecord-2.3.2/lib/active_record/base.rb:661:in `find_by_sql' d:/ruby/lib/ruby/gems/1.8/gems/activerecord-2.3.2/lib/active_record/base.rb:1553:in `find_every' d:/ruby/lib/ruby/gems/1.8/gems/activerecord-2.3.2/lib/active_record/base.rb:615:in `find' D:/ROR/Aptana/dedomenon/app/models/category.rb:50:in `get_all_with_exclusive_scope' D:/ROR/Aptana/dedomenon/app/models/category.rb:50:in `get_all_with_exclusive_scope' D:/ROR/Aptana/dedomenon/app/controllers/categories_controller.rb:48:in `index' 

这是我的database.yml文件

 postgre: &postgre adapter: postgresql database: codex host: localhost username: postgres password: root port: 5432 mysql: &mysql adapter: mysql database: project host: localhost username: root password: root port: 3306 development: <<: *postgre test: <<: *postgre production: <<: *postgre master_database: <<: *mysql 

我的master_database模型是这样的

 class Category  [:create, :save, :destroy] end 

有人有任何解决方案?

其他方式:

 class Abc < ActiveRecord::Base establish_connection Rails.configuration.database_configuration["test"] end 

现在可能想看看https://github.com/tchandy/octopus 。

这将更改单个模型对象的数据库连接。

 $config = YAML.load_file(File.join(File.dirname(__FILE__), '../config/database.yml')) class ModelWithDifferentConnection < ActiveRecord::Base establish_connection $config['connection_name_from_database_yml'] end 

如果您使用相同的服务器但只使用不同的数据库文件,那么您可以执行类似的操作。

 class ModelWithDifferentConnection < ActiveRecord::Base # Lives in the CURRICULUM database def self.table_name "database.table" end end 

我强烈建议使用MySQL适配器的MyReplication插件,它可以帮助您以优雅的方式在运行时切换连接:

 User.using(:another_database) do u = User.all end 

https://github.com/minhnghivn/my_replication

我试过你的Sample,仍然收到错误!!

 superclass mismatch for class MysqlAdapter 

我想,问题出在我的database.yml文件中。请检查此文件

 database_mysql: adapter: mysql database: project host: localhost username: root password: root port: 3306 development: adapter: postgresql database: codex host: localhost username: postgres password: root port: 5432 test: adapter: postgresql database: codex host: localhost username: postgres password: root port: 5432 production: adapter: postgresql database: codex host: localhost username: postgres password: root port: 5432 

我只在开发模式下启动杂种。

这是我的模型超类

 $config = YAML.load_file(File.join(File.dirname(__FILE__), '../../config/database.yml')) class MasterDatabase < ActiveRecord::Base self.abstract_class = true establish_connection $config['database_mysql'] end 

请纠正我..

我还必须连接并管理两个不同的数据库,所以我创建了一个名为secondbase的gem: http ://github.com/karledurante/secondbase

我不知道active_delegate,但我最近不得不访问工作应用程序的不同数据库,并没有什么真正适合我想要的。 所以我为自己写了一些东西,它就像我们说的那样在生产应用程序中运行。

固定链接connection_ninja