2009-08-19 13 views
6

estoy usando active_delegate para la conexión múltiple en los carriles. Aquí estoy usando MySQL como master_database para algunos modelos, y PostgreSQL para algunos otros modelos.conexión de base múltiple en los carriles

El problema es que cuando intento acceder a los modelos de MySQL, estoy recibiendo el error de abajo! ¡Stack trace muestra que, todavía está usando el adaptador postgresql para acceder a mis modelos 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' 

aquí es mi database.yml archivo

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 

y mi modelo master_database es como esto

class Category < ActiveRecord::Base 

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

end 

tiene ninguna solución Cualquier persona ??

Respuesta

0

No sé sobre active_delegate, pero recientemente he tenido que acceder a diferentes bases de datos para aplicaciones de trabajo, y nada encajar realmente lo que quería. Así que escribí algo para mí, se está ejecutando en aplicaciones de producción mientras hablamos.

enlace fijo connection_ninja

+0

Esa página no existe! –

4

Esto cambiará la conexión de base de datos para un solo objeto modelo.

$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 

Si está utilizando el mismo servidor, pero sólo un archivo de base de datos diferente, entonces puede hacer algo como esto en su lugar.

class ModelWithDifferentConnection < ActiveRecord::Base 

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

end 
1

he intentado ur de la muestra, que sigue recibiendo el error !!

superclass mismatch for class MysqlAdapter 

creo, el problema es con mi archivo database.yml Compruebe por favor este archivo

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 

inicio el mestizo en modo developemnet solamente.

aquí es mi modelo superclase

$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 

por favor, corríjanme ..

11

Otra forma:

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