iT邦幫忙

2022 iThome 鐵人賽

DAY 3
0

哈囉,大家好,第三天要做的任務是以Day 2 的Model 建立一些資料,昨天我總共建了兩個Models:

  1. Podcast
  2. Episode

今天則預計再建立一個Host Model,並建立Podcastx10、Hostx10(每個Podcast 各有1 個Host)和Episodex20(每個Podcast 各有2 個Episodes)。

其欄位與型態一覽如下:
List of Table

至於seeding 方式有很多種,本篇想介紹其中三種:

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

首先以第一個方式嘗試建立3 個Podcast,編輯db/seeds.rb:

Podcast.destroy_all

Podcast.create!([{
  name: "劉軒的How to人生學",
  host: "劉軒",
  introduction: "人生沒有標準答案,很多事學校教不了。但這裏有Power up秘笈:100種活出人生意義的可能性,好好生活的必備心理技能,都在《劉軒的How to人生學》。"
},
{
  name: "勃勃鬼故事",
  host: "勃勃",
  introduction: "鬼故事恐怖的地方在於,無意間聽到的;我會用輕鬆的方式來分享恐怖故事大部分的故事都來自身邊朋友經歷、網路上故事" },
{
  name: "孔夫子吃藥",
  host: "馬修",
  introduction: "誰說談教育一定要硬梆梆?每週來點知識含金量1%的幹話時間 -- 翻轉教職思維,喊出老師真心話直球對決敏感話題,正面暢談教育現場" }])

p "Created #{Podcast.count} podcasts"

接著執行rails db:seed,並進rails console 確定成功建立了三筆:

rails console

# 查看Podcast 筆數
Podcast.count
=> 3

# 查看資料是否正確
Podcast.first
=> 略

seed.rb 第一行增加Podcast.destroy_all主要用意是想清空現有資料,但若以這方式和速度完成今天的任務,可能需要花很多時間;因此不如再修改seed.rb、嘗試用迴圈的方式建立:

Podcast.destroy_all

10.times do
	Podcast.create!([{
	  name: "可樂時間",
	  host: "COLATIME",
	  introduction: "解知識的渴,尋人生的樂 - 可樂時間"
	}])
end

p "Created #{Podcast.count} podcasts"

接著我們來嘗試用第二種方式,以rails tasks 來建立資料:

# 後方的seeding 為 namespace, seed_episodes 則為task name
rails g task seeding seed_episodes

Running via Spring preloader in process 79472
      create  lib/tasks/seeding.rake

# 如此我們就能用rails -T 來查詢現有的task
# 加上seeding 則可以filter namespace
rails -T seeding
rails seeding:seed_episodes  # TODO

接著打開編輯lib/tasks/seeding.rake

namespace :seeding do
  desc "Seeding episodes"
  task seed_episodes: :environment do
    Episode.destroy_all

    0.upto(19) do |no|
      Episode.create!([{
        name: "第#{no}話",
        duration: 60,
        record_on: Datetime.now + (no * 7).days,
        host: "COLATIME",
        introduction: "開播啦~~"
      }])
      p "Created #{Episode.count} episodes"
    end
  end
end

如此就有20 筆episodes 了,雖然introduction 還有點怪,且還沒有根據關聯性拆分(尬...)

但先讓我們嘗試用第三種方式seeding,亦即在migration 中寫好、migrate 時連帶建立資料;因此就順道和Host 的表一同建立囉:

# 首先一樣generate 一個Model
rails g model Host nickname:string age:integer background:text

# 接著編輯migration 

class CreateHosts < ActiveRecord::Migration[6.0]
  def change
    create_table :hosts do |t|
      t.string :nickname
      t.integer :age
      t.text :background

      t.timestamps
    end

    10.times do
      Host.create!([{
        nickname: "COLATIME",
        age: 30,
        background: "數位創作者
                    如果你熱愛科學→ #喝杯可樂長知識
                    如果你關心社會→ #喝杯可樂看觀點
                    如果你喜歡看書→ #喝杯可樂讀語錄
                    我們是可樂時間
                    為你
                    解知識的渴
                    尋人生的樂"
      }])
    end

    p "Created #{Host.count} hosts"
  end
end

# 好了之後再下rails db:migrate

== 20220917100455 CreateHosts: migrating ======================================
-- create_table(:hosts)
   -> 0.0120s
"Created 10 hosts"
== 20220917100455 CreateHosts: migrated (0.0480s) =============================

但不知道有沒有夥伴疑惑如果下rails db:rollback,資料會怎麼樣呢?

嘿嘿...

總之今天的任務也就達成啦,也介紹了三種seeding 的方式;雖然...... 資料的關聯性和內容真的很髒哪!所以今晚可要好好構思如何整理了;咱們明天見~~


上一篇
Day 2 - 建立魯魯專案和兩張資料表
下一篇
Day 4 - Seeding 魯魯專案#2
系列文
SQL rookie 之天天魯一下30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言