You are on page 1of 2

Técnica de DRY no database.

yml
por Helton Alponti

O problema

No desenvolvimento do Bugio nós tinhamos alguns desenvoldedores usando os


sistemas operacionais Windows, Linux e Mac OS X, então o nosso arquivo database.yml
apontava cada um para um socket diferente. No Windows e no Mac OS X por exemplo
nós não declaravamos o socket, no Linux(Ubuntu) nós precisavamos apontar o socket
para /var/run/mysqld/mysqld.sock.

Isso gerava um certo incômodo para os desenvolvedores em ambiente Linux, pois


o arquivo precisa ficar alterado localmente e sempre ignorando-o quando sincronizado
com o repositório CVS. As vezes ainda, o desenvolvedor se confundia e subia ele para o
repositório.

A solução

Como o Rails adota a filosofia de DRY(Don't Repeat Yourself) e “Convention over


configuration”, nós começamos a googlear uma forma de resolver esse problema. A
principio não aviamos encontrado nada, porém nós achamos uma dica bacana que nós
adotamos.

Esse era o nosso database.yml:

1 development:
2 adapter: mysql
3 database: bugio_development
4 username: usuario
5 password: senha
6 host: localhost
7
8 test:
9 adapter: mysql
10 database: bugio_test
11 username: usuario
12 password: senha
13 host: localhost
14
15 production:
16 adapter: mysql
17 database: bugio_production
18 username: senha
19 password: usuario
20 host: localhost

Bom como vocês podem observar os atributos adpter, username, senha e host
sempre se repetem. Nós adotamos a seguinte técnica de DRY que nós achamos em
nossa gloogleada. :)

1 bugio: &bugio
2 adapter: mysql
3 host: localhost
4 username: root
5 password:
6
7 development:
8 <<: *bugio
9 database: bugio_development
10
11 test:
12 <<: *bugio
13 database: bugio_test
14
15 production:
16 <<: *bugio
17 database: bugio_production

Incrível não? Com um macete básico para evitar código de configuração repitido e
facilitando a manutenção quando necessário. :)
Você deve estar falando “Blz e o problema principal??”, calma muita calma nessa
hora.
Bom para resolver o problema proposto nesse post, fizemos:
1 bugio: &bugio
2 adapter: mysql
3 host: localhost
4 username: root
5 password:
6 socket: <%= ["/tmp/mysqld.sock",
7 "/tmp/mysql.sock",
8 "/var/run/mysqld/mysqld.sock",
9 "/var/lib/mysql/mysql.sock"].detect{|socket|
10 File.exists?(socket)
11 }
12 %>
13
14 development:
15 <<: *bugio
16 database: bugio_development
17
18 test:
19 <<: *bugio
20 database: bugio_test
21
22 production:
23 <<: *bugio
24 database: bugio_production

Bom, com aquela nova linha socket: nosso problema fica resolvido. :)
Ele simplesmente cria um Array e verifica se algum daqueles arquivos existe em
seu computador.

Bom galera, é isso. Qualquer dúvida deixem um comentário, ou postem no


RubyOnBr (www.rubyonbr.com.br)

Até a próxima. :)

You might also like