2011-11-01 14 views
13

Mi entorno: Rubí 1.9.2p290, Rails 3.0.9 y 1.8.8 rubygemCarriles 3 - base de datos múltiple con une a condición

por desgracia, tengo un problema cuando venir a través de múltiples bases de datos.

La situación es la siguiente: Tengo dos modelos conectan con dos bases de datos diferentes y también establecen una asociación entre sí. conexión a la base de datos especificando en cada modelo, le gusta mirar

class Visit < ActiveRecord::Base 
    self.establish_connection "lab" 
    belongs_to :patient 
end 

class Patient < ActiveRecord::Base 
    self.establish_connection "main" 
    has_many :visits 
end 

me dio un error cuando se cumplen siguiente escenario

@visits = Visit.joins(:patient) 

Errores: mysql2 :: Error: no existe la tabla '' lab.patients: SELECT visits. * FROM visits INNER JOIN patients EN patients. id IS NULL

Aquí la tabla 'pacientes' está en la base de datos 'principal' y la tabla 'visitas' en el 'laboratorio' de base de datos dudo cuando se ejecuta el código, que Rails está considerando la mesa de 'pacientes' es parte de 'laboratorio' base de datos [que contiene la tabla 'visitas'].

+0

Ver [Edición # 539] (https://github.com/rails/rails/issues/539) para información adicional – cweston

Respuesta

9

Bueno, no sé si esta es la solución más elegante, pero lo hice conseguir que esto funcione mediante la definición de self.table_name_prefix para volver explícitamente la base de datos nombre.

class Visit < ActiveRecord::Base 
    def self.table_name_prefix 
    renv = ENV['RAILS_ENV'] || ENV['RACK_ENV'] 
    (renv.empty? ? "lab." : "lab_#{renv}.") 
    end 

    self.establish_connection "lab" 
    belongs_to :patient 
end 

class Patient < ActiveRecord::Base 
    def self.table_name_prefix 
    renv = ENV['RAILS_ENV'] || ENV['RACK_ENV'] 
    (renv.empty? ? "main." : "main_#{renv}.") 
    end 

    self.establish_connection "main" 
    has_many :visits 
end 

Todavía estoy trabajando a través de todos los detalles cuando se trata de especificar las condiciones de combinación, pero espero que esto ayude.

+0

Este es el camino a seguir si las dos bases de datos están en la misma máquina. Bien hecho. –

+0

gracias por proporcionar una solución de trabajo.- srosenhamer –

+0

http://apidock.com/rails/ActiveRecord/Base/table_name_prefix/class – s2t2

2

Es el segundo base de datos en otra máquina? Siempre se puede hacer como se sugiere en esta otra pregunta: ¿

MySQL -- Joins Between Databases On Different Servers Using Python?

+0

No. tanto la base de datos está en la misma máquina. Rails busca una base de datos apropiada cuando llama visitas y Paciente por separado. 'visitas = Visit.first.patient' y viceversa funciona bien. Problema solo al unir ambos modelos. –

7

Podría ser más limpio que hacer algo como esto:

def self.table_name_prefix 
    "#{Rails.configuration.database_configuration["#{Rails.env}"]['database']}." 
    end 

Que se tire el nombre de la base apropiada de su archivo database.yml

1

O incluso

def self.table_name_prefix 
    self.connection.current_database+'.' 
end 
0

que haría uso la self.table_name_prefix según lo propuesto por otros, pero se puede definir un poco más limpia de esta manera:

self.table_name_prefix "#{Rails.configuration.database_configuration["#{Rails.env}"]['database']}." 

, alternativamente, se podría también utilizar esto:

self.table_name_prefix "#{connection.current_database}." 

Hay que tener en cuenta que este último ejecutar una consulta SELECT DATABASE() as db la primera vez que se carga esa clase.

Cuestiones relacionadas