2009-08-19 6 views
6

Ich verwende Active_Delegate für mehrere Verbindungen in Rails. Hier verwende ich mysql als master_database für einige Modelle und postgresql für einige andere Modelle.Mehrere Datenbankverbindungen in Rails

Problem ist, dass wenn ich versuche, auf die mysql-Modelle zuzugreifen, bekomme ich den Fehler unten! Stack-Trace zeigt, dass es immer noch den Postgresql-Adapter verwendet, um auf meine MySQL-Modelle zuzugreifen!

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' 

hier ist meine database.yml Datei

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 

und mein master_database Modell ist wie dieser

class Category < ActiveRecord::Base 

    delegates_connection_to :master_database, :on => [:create, :save, :destroy] 

end 

Wer noch keine Lösung hat ??

Antwort

0

Ich weiß nicht über active_delegate, aber ich musste vor kurzem auf verschiedene Datenbanken für Arbeitsanwendungen zugreifen, und nichts passte wirklich, was ich wollte. Also habe ich etwas für mich geschrieben, es läuft in Produktionsanwendungen, während wir sprechen.

Feste Verbindung connection_ninja

+0

Diese Seite existiert nicht! –

4

Dadurch wird die Datenbankverbindung für ein einzelnes Modellobjekt ändern.

$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 

Wenn Sie denselben Server verwenden, sondern nur eine andere Datenbankdatei, dann können Sie stattdessen so etwas zu tun.

class ModelWithDifferentConnection < ActiveRecord::Base 

    # Lives in the CURRICULUM database 
    def self.table_name 
    "database.table" 
    end 

end 
1

Ich versuchte Ihr Sample, immer noch Fehler !!

superclass mismatch for class MysqlAdapter 

Ich denke, das Problem mit meiner database.yml Datei diese Datei

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 

i die Mischlings in developemnet Modus starten nur .Bitte zu überprüfen.

hier ist mein Modell Superklasse

$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 

Bitte korrigieren Sie mich ..

11

Ein anderer Weg:

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