plant seed自动化执行数据任务

Published on:

本章的作業目標:

rake 的概念解說

如何撰写seed.rb来自动化执行数据任务?

撰写rake dev:build 相当于自動化執行清空+重跑 migration +種子載入資料

1.rake 的概念解說

rake 直譯上來說就是 Ruby Make ,用 ruby 語言開發的 build tool

也可以說是一套 task 管理工具,幫助我們自動化執行所需要的指令

rake -T
會列出所有目前能執行的 rake 指令 (包含 install gem 以後建置在內的)

像我們之前常用的
rake db:migrate
就是執行 資料庫異動設定 的 task

2.撰写seed.rb

我們在開發專案的時候,常會需要弄些假資料來填充版面
或是說當資料庫炸掉的時候,會很想一股腦把 資料庫整個 reset 掉
並希望 reset 完還能把一些資料放進去,像是 user, groups, posts,不用一個個手動輸入

我們來做一個 seed 檔,需求:

建立一個 user 帳號 => example@gmail.com , 密碼 12345678
並用此帳號建立 10 個 公开的jobs,建立 10 個 隐藏的jobs。

打開 db/seed.rb

puts "这个seeds文件可以自动建立一个admin账号,并且创建10个public jobs,以及10各hidden jobs"

create_account = User.create([email: 'example@gmail.com', password:'123456', password_confirmation: '123456', is_admin: 'true'])
puts "Admin account created."

create_job = for i in 1..10 do
  Job.create!([title: "Job no.#{i}", description: "这是用seeds文件建立的第 #{i} 个公开的工作", wage_upper_bound: rand(50..99)*100, wage_lower_bound: rand(10..49)*100, is_hidden: "false"])
end
create_job = for i in 1..10 do
  Job.create!([title: "Job no.#{i}", description: "这是用seeds文件建立的第 #{i} 个隐藏的工作", wage_upper_bound: rand(50..99)*100, wage_lower_bound: rand(10..49)*100, is_hidden: "true"])
end

puts "10 Public jobs created."
puts "10 Hidden jobs created."

rake db:reset
rake db:reset 是內建的 task ,會執行一整套流程
包含 db:drop( 資料庫移除 ) => db:create( 資料庫建立 )
=> db:schema:load ( 資料庫欄位建立 ) => db:seed ( 執行資料庫種子 )

重新啟動 rails s

用帳號: example@gmail.com 密碼 12345678 登入,並進入隨便一個討論版

3.撰寫 rake dev:build

雖然 db:reset 已經能自動地幫我們把資料庫清空、重建、跑 seed
如果想把整個開發中專案的資料一切歸零,還需要跑 rake log:clear 跟 rake tmp:clear
如果懶得一個個打上述指令 + rake db:drop + rake db:create + rake db:migrate + rake db:seed
來把整個專案清空重建並建立 seed 檔
可以寫一個 rake 來自動化執行

在 lib/tasks/ 資料夾建立一個檔案 dev.rake

namespace :dev do
  desc "Rebuild system"
  task :build => ["tmp:clear", "log:clear", "db:drop", "db:create", "db:migrate"]
  task :rebuild => [ "dev:build", "db:seed" ]
end

這樣只要打

rake dev:build
即可把專案資料一切清空歸零重建

rake dev:rebuild
即可重建完再跑 seed

Comments

comments powered by Disqus