iT邦幫忙

2022 iThome 鐵人賽

DAY 4
0

各位夥伴好,昨天介紹了三種seeding 的方式,不知道大家喜歡或習慣用哪個呢?

複習一下昨天介紹的seeding 方式:

  1. 在seed.rb 寫
  2. 利用自建的rails tasks 產生
  3. 在migration 中寫好要建立的資料,migrate 時連帶建立

個人覺得三者適用的時機不太一樣:
第1 種適合正式網站上線前備妥資料庫必含的data,
第3 種則比較像patching,但昨天介紹的在create table 時連帶建立data,其實有點偷吃步啦;實際拆成兩個migrations 應當會比較適合;
而個人較喜歡第2 種,不僅延展性較高,可隨時修改、執行,也能拆分seeding 任務;尤其當Model 關聯性逐漸複雜時,甚至可用來確認拆分的各小段皆可順利執行,最後也能將各task 的內容寫在seed.rb 內,以便為production server seed data,或搭配migration 來patch/seed data 之用

因此,被翻爛的書今天要先將昨日seeding 的方式整理一下,都先改寫成第2 種rails task


初步整理好後,我想為了之後加入Model 關聯性後做準備,因此想寫入一些以假亂真的資料,而不是用同筆資料、搭配迴圈產生一模一樣的data;因此接著要介紹大家耳熟能詳的gem——Faker:

參考資料:

  1. Faker on RubyGems
  2. Faker Githubs

步驟:

  1. 先在Gemfile development 的區塊加入faker,並執行bundle install
# 修改Gemfile 
group :development do
  # Use to creating fake data
  gem 'faker', '~> 2.22'
end

# 或執行
gem install faker -v 2.22.0

# 執行bundle install
bundle
  1. 安裝好Faker gem 後就能在rails task 裡使用Faker 了,讓我們來修改其中一個task 試試:
namespace :seeding do
  desc "Seeding podcasts"
  task seed_podcasts: :environment do
    Podcast.destroy_all

    10.times do
      Podcast.create!([{
        name: "可樂時間",
        host: Faker::Name.name, # 利用Faker 隨機產生主持人的名稱
        introduction: "解知識的渴,尋人生的樂 - 可樂時間"
      }])
    end

    p "Created #{Podcast.count} podcasts"
  end
end

# 執行rails task
rails seeding:seed_podcasts
=> "Created 10 podcasts"
  1. 確定可正常執行和建立data 後,可開始加入Faker 內含的各項方法來增加data 的多樣化:
    10.times do
      Podcast.create!([{
        name: Faker::Book.unique.title,
        host: Faker::Superhero.unique.name,
        introduction: Faker::Movie.quote
      }])
    end
    
=> "Created 10 podcasts"

看起來資料多樣性做到了!但,不知能不能讓Faker 自動產生中文資料呢?

...

答案是可以的,在config/application.rb'內加入Faker::Config.locale = 'zh-TW'即可:

# 修改config/application.rb:
Faker::Config.locale = 'zh-TW'

# 修改rails task:
    10.times do
      Podcast.create!([{
        name: Faker::Book.unique.title,
        host: Faker::Name.unique.name, # 注意這句
        introduction: Faker::Movie.quote
      }])
    end
    
=> "Created 10 podcasts"

# 進console 隨便抓一筆來看

=>name: The Way of All Flesh
  host: 景佳蓉
  introduction: Aspernatur quia sit. Iure molestiae voluptatem. Delectus
    nesciunt velit. Amet aperiam totam. Sed est distinctio. Repudiandae qui rerum.
    Incidunt deserunt quaerat. In quos voluptatem. Autem aliquam accusamus. Ea aperiam
    nulla. Commodi sint enim. Eos dolori.

Hmm... 那欸安捏?這似乎有點差強人意吧?但這主因是目前Faker 支援zh-TW 可用的Generators 資料不多,即便能自己用yml 檔擴充,甚或乾脆整理csv 檔當base 匯入,但這就日後再分享吧!而以目前筆者的計畫來看,簡單用Faker 寫入資料即可供日後query 用,因此還是改回用英文來產生假資料吧!

因此今天的自我任務為:

  1. 將seeding 都改為rails tasks
  2. 以Faker 亂數產生data
  3. 構思、完成關聯圖(For Day 5)

而今天的文章也先到此告一段落啦,謝謝大家~!


上一篇
Day 3 - Seeding 魯魯專案#1
下一篇
Day 5 - 插話:魯魯上色幫手——amazing print
系列文
SQL rookie 之天天魯一下30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言