Post

Fazendo seed do banco com tasks Rake

Fazendo seed do banco com tasks Rake

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.

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.

:sparkling_heart: Pontos-chave:

  • bin/rails db:seed semeia produtos.
  • bin/rails db:custom_seed semeia clientes e pedidos em desenvolvimento.
  • desc define a descrição exibida em rake -T ou bin/rails.

:warning: Pegadinhas

  • bin/rails db:reset não roda tasks custom. Para resetar e semear, use bin/rails db:drop db:create db:seed e depois bin/rails db:custom_seed.

:tada: 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.