【JA魔改秘笈】Seeds.rb 越來越肥怎麼辦?兩個步驟實現「執行指定檔案,生成數據」

關於這篇教程

  • 使用者、商品內容、類型 / 分類等資料,通通塞在 Seeds.rb,一拉就是幾百行代碼。再多註釋,也還是理不清這一鍋大雜燴。
  • 執行 rake db:seed 時,因為資料龐大,運行到天荒地老。一個小地方錯誤,又得認命去撈代碼、修正,再重來。
  • 網站上線後,添加了新功能、Models,總不能再次利用 Seeds.rb 來建立數據吧?舊的內容要先註解掉?暈了。

如果你也遇過上述狀況,有過「唉,如果能執行部分內容就好了!」的心聲。相信我,你並不孤獨!
這篇教程為大家提供一個解決方案:為專案設置多個用來生成數據的 .rb 檔案,並指定要運行哪一個檔案。

--

專案架構擴大、內容增多,時不時又有新添內容的需求,只靠單一 Seeds.rb 檔,會非常混亂;跟著這篇教程,一起實現:「執行的指定檔案,生成數據」,有條有理管理數據生成的相關檔案、讓 Seeds.rb 檔案內容不再失控。


Step 1 客製一個 Rake 指令(Rake Task)

在終端機執行:$ touch lib/tasks/split_seed.rake,產生一個 .rake 檔案;我們需要這個檔案來客製一個任務(Rake Task)。建立檔案後,在 lib/tasks/split_seed.rake 加入下方的代碼內容。

  • lib/tasks/split_seed.rake
# --=== 客製任務(Task):rake db:seed:single ===-- #

namespace :db do
  namespace :seed do
    task :single => :environment do

      # 透過路徑找到檔案

      filename = Dir[File.join(Rails.root, 'db', 'seeds', "#{ENV['SEED']}.rb")][0]

      puts "檔案:#{filename},開始執行。"

      # 如果檔案存在,執行檔案內容

      load(filename) if File.exist?(filename)

      puts "檔案:#{filename},執行成功。"
    end
  end
end


Step 2 創建 db/seeds 資料夾

在終端機執行:$ mkdir db/seeds,在 db 目錄下創建一個名為 seeds 的資料夾,用來放置 .rb 檔案。

作到這一步,環境就算設置妥檔了!未來你只要:

  • $ touch db/seeds/example_seeds.rb,新增 .rb 檔案。

    例如:我們創一個用來創建產品的 product_seeds.rb,並加入一些內容。

  • 運行指令

    • Localhost 本機端:$ rake db:seed:single SEED=example_seeds
    • Heroku 正式端:$ heroku run rake db:seed:single SEED=example_seeds

    假如我們要使用剛剛建立的 product_seeds.rb 生成產品數據,就在終端機輸入:$ rake db:seed:single SEED=product_seeds


成功!往後就可以利用這個方式,執行指定的 .rb 檔案、新增數據囉。




有任何開發上的問題,都可以透過 Slack:xbearx1987、anndo-2 找到吉米或我,我們很樂意為你解答。

如果你覺得教程對你有幫助,希望你能至我們的作品 J & A SELECT投下寶貴的一票!你的投票,代表的是對好作品、好教程的支持與鼓勵,也會成為我們持續分享的動力。

Comments

comments powered by Disqus