La consola de Rails no carga automáticamente los modelos para el 2do DB
-
03-07-2019 - |
Pregunta
Tengo un proyecto de Rails que tiene una base de datos de Postgres para la aplicación real pero que necesita extraer una gran cantidad de datos de una base de datos de Oracle.
database.yml se parece a
development:
adapter: postgresql
database: blah blah
...
oracle_db:
adapter: oracle
database: blah blah
Mis modelos que descienden de los datos en la base de datos de Oracle se ven algo así como
class LegacyDataClass < ActiveRecord::Base
establish_connection "oracle_db"
set_primary_key :legacy_data_class_id
has_one :other_legacy_class, :foreign key => :other_legacy_class_id_with_funny_column_name
...
end
Ahora, por costumbre, a menudo realizo gran parte de mi desarrollo temprano (y este es el desarrollo temprano) al codificar un poco y luego jugar en la consola de Rails. Por ejemplo, después de definir todas las asociaciones para LegacyDataClass, comenzaré a probar cosas como a = LegacyDataClass.find (: first); pone un.some_association.name
. Inesperadamente, esto muere con LegacyDataClass que no se ha cargado.
Luego puedo requerir 'LegacyDataClass'
que soluciona el problema hasta que necesito recargar!
, que en realidad no lo volverá a cargar, o hasta que abra una nueva instancia de la consola.
Así las preguntas:
- ¿Por qué sucede esto? Claramente hay algo de magia de Rails que no entiendo.
- ¿Cuál es la solución de Rails conveniente ?
Solución
Creo que esto podría tener que ver con el nombre de tu modelo, en lugar de con tu conexión. La convención de Rails es que los nombres de las clases de modelos son CamelCase, mientras que los archivos en los que residen están en minúsculas + guión bajo.
El " LegacyModel " por lo tanto, la clase debe estar en models / legacy_model.rb
. Su declaración sobre " require 'LegacyDataClass' "
indica que este no es el caso y, por lo tanto, Rails no sabe cómo cargar ese modelo automáticamente.
Otros consejos
Escribí algo para una aplicación en el trabajo que maneja conexiones a otras bases de datos 'en tiempo de ejecución, podría ser de ayuda.