Às vezes, você está hackeando um novo recurso em seu próprio branch e, por algum motivo, você precisa trocar de branches. Git nasceu para lidar com isso, então você faz checkout de um novo branch e todos os seus arquivos de trabalho são atualizados de acordo. Super.
Infelizmente, seu banco de dados não é atualizado com o código. Você ainda está usando o mesmo banco de dados de desenvolvimento e tem alterações de esquema, então quando você executa:
rake db:migrate db:test:prepare
Seu schema.rb é atualizado com o esquema para seu novo recurso. Isso pode quebrar as coisas, especialmente se você adicionou restrições.
Você pode criar um novo ambiente para ter:
- desenvolvimento
- other_development
- teste
- Produção
Mas provavelmente não é uma boa opção.
- Afeta outros desenvolvedores
- Você provavelmente vai acabar hackeando em vários lugares para contornar isso porque …
- Não é realmente um ambiente diferente
Várias cópias de trabalho
Alguns podem preferir uma solução baseada em branches do Git. Decidi ir com várias cópias de trabalho porque (para mim) é mais rápido alternar entre elas.
Git stash é legal, mas tem seus limites. Se estou trocando branches com frequência porque sou responsável por implantações ou algo assim, acho mais fácil apenas ter duas cópias de trabalho e ter uma área de trabalho virtual separada para cada, para não ficar confuso.
Para fazer isso, editei database.yml e adicionei:
<%
def prefix
name_parts = File.basename(Dir.pwd).split('$')
name_parts.count == 2 ? "#{name_parts.last}_" : ''
end
%>
E então na development:
seção:
database: <%= "#{prefix}myproject_development" %>
Com essas mudanças em vigor, se eu clonar o repo em um diretório com um $deploy
sufixo (por exemplo myproject$deploy
), ele esperará que o banco de dados de desenvolvimento seja chamado deploy_myproject_development
. Esteja ciente de que ‘$’ provavelmente é considerado especial pelo seu shell, então você precisará citá-lo. Por exemplo:
git clone git@github.com:myaccount/myproject.git "myproject$deploy"
Obviamente, você precisará executar rake db:setup
novamente, mas depois disso você terá dois bancos de dados de desenvolvimento separados e ele escolherá automaticamente o correto com base no nome do diretório que contém o aplicativo.