Rails Console não carrega modelos automaticamente para 2º dB
-
03-07-2019 - |
Pergunta
Eu tenho um projeto Rails que possui um banco de dados Postgres para o aplicativo real, mas que precisa extrair muitos dados de um banco de dados Oracle.
Database.yml se parece
development:
adapter: postgresql
database: blah blah
...
oracle_db:
adapter: oracle
database: blah blah
Meus modelos que descem de dados no Oracle DB parecem algo 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
Agora, pelo hábito, muitas vezes faço muito do meu desenvolvimento inicial (e isso é um desenvolvimento precoce) codificando um pouco e depois jogando no console do Rails. Por exemplo, depois de definir todas as associações para o LegacyDataclass, vou começar a tentar coisas como a = LegacyDataClass.find(:first); puts a.some_association.name
. Inesperadamente, isso morre com o LegacyDataclass ainda não está sendo carregado.
Eu posso então require 'LegacyDataClass'
que corrige o problema até que eu precise reload!
, que não vai realmente recarregá -lo ou até abrir uma nova instância do console.
Assim, as perguntas:
- Por que Isso acontece? Claramente, existem algumas magia do Rails que eu não estou entendendo.
- Quais são os trilhos convenientes Gambiarra?
Solução
Eu acredito que isso pode ter a ver com o nome do seu modelo, em vez da sua conexão. A Convenção do Rails é que os nomes das classes de modelo são camelcase, enquanto os arquivos em que eles residem são minúsculos+sublinhados.
A classe "Legacymodel" deve, portanto, estar em models/legacy_model.rb
. Sua declaração sobre "require 'LegacyDataClass'"
Indica que esse não é o caso e, portanto, os Rails não sabem como carregar automaticamente esse modelo.
Outras dicas
Eu escrevi algo para um aplicativo no trabalho que lida com conexões com outros bancos de dados no tempo de execução, pode ser capaz de ajudar.