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.

  1. Bruno says:

    olá viana

    muito bom o artigo parabéns!

    apenas uma duvida, por que é necessario este comando? “self.abstract_class = true”

    Bruno Andrade

  2. Andrey Viana says:

    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.

  3. Uma vez cogitei a possibilidade de um mesmo model poder ser gravado em dois bancos diferentes. Será que isso seria possivel?

  4. Andrey Viana says:

    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!

  1. There are no trackbacks for this post yet.

Leave a Reply