2009-08-19 10 views
6

Sto utilizzando active_delegate per connessioni multiple in Rails. Qui sto usando mysql come master_database per alcuni modelli, e postgresql per alcuni altri modelli.Connessione a più database in Rails

Il problema è che quando provo ad accedere ai modelli mysql, visualizzo l'errore qui sotto! La traccia di stack mostra che, sta ancora usando l'adattatore postgresql per accedere ai miei modelli 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' 

Ecco il mio file di 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 

e il mio modello master_database è come questo

class Category < ActiveRecord::Base 

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

end 

Qualcuno ha qualche soluzione ??

risposta

0

Non so su active_delegate, ma di recente ho dovuto accedere a diversi database per le applicazioni di lavoro, e nulla di veramente adatto a ciò che volevo. Così ho scritto qualcosa per me stesso, è in esecuzione nelle applicazioni di produzione mentre parliamo.

collegamento fisso connection_ninja

+0

Quella pagina non esiste! –

4

Questo cambierà la connessione al database per un singolo oggetto del modello.

$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 

Se si utilizza lo stesso server ma solo un file di database diverso, è possibile fare invece qualcosa di simile.

class ModelWithDifferentConnection < ActiveRecord::Base 

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

end 
1

Ho provato il mio esempio, ottenendo ancora errore !!

superclass mismatch for class MysqlAdapter 

penso, il problema è con il mio file database.yml Controlli prego questo file

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 

avvio il bastardino solo in modalità developemnet.

qui è il mio modello superclasse

$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 

Si prega di correggere me ..

11

Un altro modo:

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