Fazendo seed do banco com tasks Rake
Fazendo seed do banco com tasks Rake
Por que usar tasks customizadas de seeding?
Rails roda seeds via db/seeds.rb com bin/rails db:seed:
1
2
3
4
5
6
7
8
9
10
# db/seeds.rb
puts "Creating initial data..."
5.times do |i|
Product.create(
name: "Product #{i}",
price: rand(10..100)
)
end
Isso basta para casos simples, mas você pode precisar de dados diferentes por ambiente. Tasks customizadas permitem seeds específicos.
Lógica de seed customizada
Suponha que o app tenha produtos, pedidos e clientes. Queremos semear produtos em dev e prod, mas pedidos/clientes só em dev.
Seed de Produtos
Primeiro, criamos a lógica em db/seeds.rb:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# db/seeds.rb
def seed_products
puts "Seeding products..."
10.times do |i|
Product.create(
name: "Product #{i}",
price: rand(10..100)
)
end
end
seed_products
Criando uma task Rake customizada
Depois, criamos uma task para pedidos e clientes em dev. Em lib/tasks, gere a task:
1
bin/rails g task db custom_seed
O arquivo gerado recebe a lógica de seed:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# lib/tasks/db_custom_seed.rake
namespace :db do
desc "Seed custom data for development"
task custom_seed: :environment do
seed_customers
seed_orders
end
end
private
def seed_customers
puts "Seeding customers..."
5.times do |i|
Customer.create(
name: "Customer #{i}",
email: "customer#{i}@example.com"
)
end
end
def seed_orders
puts "Seeding orders..."
customers = Customer.all
customers.each do |customer|
3.times do
Order.create(
customer: customer,
total: rand(50..200)
)
end
end
end
Rodando as tasks
Para semear o banco:
1
bin/rails db:seed
Isso semeia produtos. Para dados de dev:
1
bin/rails db:custom_seed
Isso semeia clientes e pedidos.
Pontos-chave:
-
bin/rails db:seedsemeia produtos. -
bin/rails db:custom_seedsemeia clientes e pedidos em desenvolvimento. -
descdefine a descrição exibida emrake -Toubin/rails.
Pegadinhas
-
bin/rails db:resetnão roda tasks custom. Para resetar e semear, usebin/rails db:drop db:create db:seede depoisbin/rails db:custom_seed.
Conclusão
Use db:seed para dados comuns e uma task custom para dados específicos de ambiente. Mantenha os seeds idempotentes para poder rerrodar com segurança.
Esta postagem está licenciada sob
CC BY 4.0
pelo autor.