Rails e o Development Seed
Criado em: 05/07/2014
Você mudou de equipe e começou em um projeto novo, rodou bundle, migrate e iniciou o servidor. Criou uma conta neste novo sistema e… WTF este sistema faz?
É comum o projeto depender de algumas(muitas) informações para ele começar a mostrar estas informações ao invés de um monte de blank slates. Algumas destas informações algumas vezes são cadastradas apenas pela área administrativa do sistema. Como podemos deixar mais fácil a entrada de novos membros em um novo projeto?
No Rails podemos definir o nosso seed em db/seeds.rb
. Mas como queremos que nosso seed seja carregado apenas em desenvolvimento vamos criar um arquivo especifico para ele em db/seeds/development.rb
. Este arquivo não é carregado por padrão quando rodamos nosso seed, para fazer isso simplesmente o carregamos no nosso seed quando o ambiente for development.
# db/seeds.rb
if Rails.env.development?
require_relative 'seeds/development'
end
E agora simplesmente criamos o nosso seed.
# db/seeds/development.rb
def create_posts_to(user)
total_of_posts = rand(1..3)
total_of_posts.times.each do |i|
user.posts.create!(title: "Post #{i} from #{user.name}",
content: "Content of post #{i}")
end
end
unless User.any?
(1..10).each do |i|
puts "Creating User #{i}"
User.create!(name: "User #{i}", email: "user#{i}@example.com")
end
end
unless Post.any?
User.all.each do |user|
puts "Creating posts to user #{user.name}"
create_posts_to(user)
end
end
Como queremos que o seed seja executado apenas quando não tivermos estas informações verificamos por elas antes de criarmos utilizando o any?
. Criamos um pequeno método para gerar os posts, pois assim cada usuário não terá sempre o mesmo número de post para isso utilizamos o rand
. E como dica sempre use métodos que lance uma exceção em caso de erro pois se alguma validação falhar por exemplo temos o feedback mais rápido.
Seguindo esta prática você está ajudando a:
- Novas pessoas que entrarem no projeto
- Você mesmo quando precisar reiniciar o banco de dados ou trocar de máquina
Lembrando que sempre temos que revisitar estes seeds pois novos campos são adicionados no banco, novas validações e mesmo novos models que ainda não foram criados. Podemos revisitá-los quando rodamos o seed em algum momento ou quando uma nova pessoa entra no projeto e sente falta de alguma informação. Ela já pode contribuir gerando esta informação no seed.
Aprendi esta técnica enquanto trabalhava com o Fábio =)
Pode parecer uma boa ideia utilizar FactoryGirl, mas não é ;p saiba mais aqui.
Caso queira dados “mais reais” pode utilizar o faker.
Precisando de uma solução mais complexa de uma olhada no seedbank.
Comentários
Comentários powered by Disqus