Rails: Utilizando mais (vários) bancos de dados
Pode não parecer, mas é muito comum em alguns casos um aplicativo precisar realizar requisições em mais de um banco de dados. Saiba como você pode fazer para usar vários banco de dados na mesma aplicação:
Primeiramente você pode alterar o arquivo database.yml que fica na pasta config, inclua nele algo assim (sem os traços):
—————
banco_dados_dois: adapter: mysql encoding: utf8 pool: 5 wait_timeout: 10 username: nome_de_usuario password: senha database: banco_dados_dois host: ip_ou_endereco_url_do_servidor # caso exista um outro servidor
—————
Feito isso, crie um novo Model (script/generate model NomeDoModel) com nome BancoDadosDois (ou qualquer outro) e adicione:
class BancoDadosDois < ActiveRecord::Base self.abstract_class = true establish_connection "banco_dados_dois" end
Após isto, basta extender os Models que você precisa com esse Model que acabamos de criar. Assim as requisições vão buscar informações do BancoDadosDois. Para extender basta fazer:
class UserDois < BancoDadosDois end
Após isto todas as requisições do Model UserDois serão pesquisadas no banco de dados “banco_dados_dois” que está indicado no arquivo database.yml
Todos os métodos do ActiveRecord continuam iguais, o que muda é que por exemplo o Model User vai buscar informações no banco de dados “banco_dados_padrao”, enquanto o UserDois vai buscar no “banco_dados_dois”.
Já os outros Models que não foram alterados, continuam buscando informações no banco de dados padrão.
Qualquer dúvida deixe seu comentário que logo responderei.
olá viana
muito bom o artigo parabéns!
apenas uma duvida, por que é necessario este comando? “self.abstract_class = true”
Bruno Andrade
Olá Bruno, um dos principais motivos do uso do “abstract_class” no ActiveRecord é para permitir que um aplicativo possa trabalhar com vários bancos de dados simultaneamente.
Os objetos do ActiveRecord procuram na cadeia de classes pela conexão do banco de dados, então tendo uma classe AR abstrata separada ao invés da ActiveRecord::Base, você pode agrupar os modelos fazendo com que eles compartilhem da mesma conexão com o BD em questão.
Uma vez cogitei a possibilidade de um mesmo model poder ser gravado em dois bancos diferentes. Será que isso seria possivel?
Hmm essa é uma boa pergunta, eu não fui muito a fundo nisso ainda e por isso ainda não sei responder com certeza, mas acredito que não seja possível.
Assim que der vou pesquisar sobre isso, e te dou um retorno, valeu!