Pergunta

Eu li muitas das perguntas/tópicos existentes sobre esse assunto, mas lembre -se de que Nenhum deles abordaram diretamente meu problema. Também lembre -se de que isso é NÃO uma situação para o database.yml, pois não conhecerei as informações do banco de dados com antecedência.

Dito isto, preciso de uma solução para DINAMICAMENTE conectando -se a vários bancos de dados em um aplicativo Rails. Minha situação é que tenho vários sites de registro de dados, todos com uma tabela de dados simples (eventos, registro de data e hora, valor). Esses sites precisam (e serão) permanecerem devido a aplicativos locais que precisam usá -los.

O que eu preciso é criar um aplicativo que mantenha uma tabela de "mysql_logins" e usa cada um desses logins para se conectar a qualquer um dos vários bancos de dados e fornecer gráficos/gráficos para os dados.

Meu modelo "Data" permanecerá o mesmo para todos os bancos de dados MySQL aos quais eu conecto, simplesmente preciso dizer ao meu modelo para conectar -se a um banco de dados diferente em tempo real. Espero que isso seja incrivelmente simples, mas veremos.

Foi útil?

Solução

Você quer ActiveRecord :: base#estabelecimento_connection. Você provavelmente desejará usá -lo em uma subclasse abstrata para que os modelos usando as conexões manuais não perturbem o uso da conexão pelo restante do seu aplicativo:

class LogBase < ActiveRecord::Base
  self.abstract_class = true
end

class LogItem < LogBase
  ...
end

LogItem.establish_connection { ... }

LogItem.find_by_ ...

Se você tiver apenas um modelo que torne as conexões manuais, a classe abstrata é desnecessária.

Você conhece o conjunto completo de bancos de dados aos quais você pode se conectar? Nesse caso, o database.yml ainda pode ser útil para você. Você pode colocar todas as informações lá como um diretório, dando a cada banco de dados um nome e depois escolheu dinamicamente qual deles estabelecer_connection no aplicativo usando esses nomes:

# database.yml
atlanta:
  host: atlantadb.foo.com

# foo.rb
LogItem.establish_connection :atlanta

A configuração de conexões pode ser bastante pesada, duplamente, se os sites forem separados pela Wide Area Network. Eu consideraria se faz mais sentido usar uma abordagem de carregamento de transformação de extrato e usar um trabalho horário/diário para copiar os dados para um site de relatórios centralizado. Essa é a forma mais básica de um data warehouse e é uma abordagem muito usada. Se você está usando o MySQL, MAATKIT SYNC é uma pequena ferramenta legal, como o RSYNC para tabelas. Como alternativa, você provavelmente usa um banco de dados que suporta a replicação mestre-escravo, embora isso possa ser consideravelmente mais complicado de manter.

Outras dicas

O Rails ainda não suporta vários bancos de dados fora da caixa (pode nunca, quem sabe). Você precisará de alguma forma sequestrar a conexão do banco de dados no ActiveRecord para esse modelo.

Aqui é a documentação de registro ativo para isso, e aqui está o documentação específica você terá que substituir.

este é algo que realmente explica bem o processo.

Há também algum Ready semi-produção projetos atacando esse problema.

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