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?
Foi útil?

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.

http://github.com/cherring/connection_ninja

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top