iT邦幫忙

2022 iThome 鐵人賽

DAY 10
0
Modern Web

速成 Phoenix, 2022年最受喜愛框架系列 第 10

{10, Ecto, "Changeset 改變集"}

  • 分享至 

  • xImage
  •  

什麼是 changeset

changeset (改變集) 紀錄了

  • 原始的資料
  • 準備要更改的資料
  • 有沒有錯誤,錯什麼

舉一個例子來解釋,假如在我們的系統上面存放著很多客戶資料,有一天我們想要幫一個舊的客戶更新電話,就會有以下步驟:

  1. 用條件(如客戶姓名)找出客戶資料
  2. 寫出這次要變更的項目與與變更的內容
  3. 檢查資料規格
  4. 送到資料庫變更

https://ithelp.ithome.com.tw/upload/images/20220914/20141054oxbVep0uZb.png

如圖所示 我們在轉入 changeset 的時候會檢查我們在 schema 設定好的資料驗證,
如果沒有錯誤就可以存入資料庫。

Update 更改紀錄

讓我們用前面新增的 Post 來練習看看
一樣使用 iex -S mix

先 alias 我們這次會用到的模組才不用打很多字

alias Blog.Repo
alias Blog.Posts.Post

複習一下上次用的拉出全部

Repo.all(Post)

但是這次我們拉一個就好,我們用 title 來撈,並用一個變數接起來

post_b = Repo.get_by(Post, title: "文章B")

如果忘記接起來 可以用 v 來取上一行的值

Repo.get_by(Post, title: "文章B")
post_b = v

使用上次寫好的 Post.changeset 方法來加入改動組成 changeset

changeset = Post.changeset(post_b, %{body: "更新過的文章B內容"})

https://ithelp.ithome.com.tw/upload/images/20220914/20141054jFp56x1WeE.png

儲存!

Repo.update(changeset)
#=> {:ok, ...}

Insert 新增紀錄

新增的流程跟剛剛差不多,只差在我們不用先撈舊的紀錄出來,給他一個空的 Post struct

changeset = Post.changeset(%Post{}, %{title: "全新的文章D"})

這個時候會發現 error 裡面有東西,整個 changeset 的 valid? 也是 false

https://ithelp.ithome.com.tw/upload/images/20220914/20141054EmlNUpHUpm.png

因為我們在 Post.changeset 裡面有規定 title 跟 body 都是必填項目

這個時候如果 insert 會失敗

Repo.insert(changeset)
#=> {:error, ...}

重新 cast 一次

changeset = Post.changeset(%Post{}, %{title: "全新的文章D", body: "內容"})
Repo.insert(changeset)
#=> {:ok, ...}

上一篇
{09, Phoenix, "從 schema 開始 (下)"}
下一篇
{11. Phoenix, "邏輯放在 Context"}
系列文
速成 Phoenix, 2022年最受喜愛框架30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言