when_to_use_after_commit_with_active_record

after_commit 是一種 Actice Record 的 Callback 當我們透過 Active Record 與資料庫互動時,有許多的時機點可以觸發 Active Record Callback,對資料做檢查或是儲存後的其他操作. 使用情境 舉一個之前專案的例子,在網站上有許多的組織以及其中的成員,當我們新增成員加入組織時,我們需要寄信通知組織的管理員(有成員加入組織等等…) 我們可以在 model.rb 中利用 after_save 去執行寄信,當成員成功加入組織後(user.save),執行寄信程式,儘管看起來沒問題,寄信程式的確會在 user.save 成功後執行。 但從資料庫的角度來看,如果新增成員後還有其他操作,一旦失敗,資料庫便會將整個 transaction 退回,即 ACID 中的 Atomicity (全部成功、或全部失敗) 而這時背景執行的寄信程式,便無法正確執行 因此,我們可以改用 after_commit callback ,確保資料庫 transation 成功 commit 後,才呼叫寄信程式寄信。 reference https://blog1.westagilelabs.com/when-to-use-after-commit-in-rails-f5e53a22bb9 https://guides.rubyonrails.org/v6.1/active_record_callbacks.html

2022, October 9 · 1 min · 41 words · Me

LeetCode Weekly Contest 313

Weekly Contest 313 2427. Number of Common Factors Given two positive integers a and b, return the number of common factors of a and b. An integer x is a common factor of a and b if x divides both a and b. Constraints: 1 <= a, b <= 1000 給定正整數a, b,回傳他們的公因數的數量 條件: 1 <= a, b <= 1000 想法: x 從 1 開始到 min(a,b),如果 a 可以被 x 整除 且 b 可以被 x 整除,x 即為 (a,b) 的公因數...

2022, October 3 · 2 min · 415 words · Me

LeetCode Biweekly Contest 89

Biweekly Contest 89 2423. Remove Letter To Equalize Frequency You are given a 0-indexed string word, consisting of lowercase English letters. You need to select one index and remove the letter at that index from word so that the frequency of every letter present in word is equal. Return true if it is possible to remove one letter so that the frequency of all letters in word are equal, and false otherwise....

2022, October 3 · 2 min · 342 words · Me

Environment for Mac

從第一篇文章可以知道我是在 WSL(Windows Subsystem for Linux)上寫文章的,體驗了一個多月下來,以 Windows 進行練習,除了 路徑問題(檔名含中文等 unicode 字元) 終端機環境整合(powershell wsl zsh) 檔案系統(CRLF 刪檔案速度) 畫面分享(AppleTV 不給連?) 外也沒那麼不堪,而憑藉著從小電腦課的主場優勢有人學校是滿滿的 Mac 嗎,加上微軟這幾年擁抱開源下,似乎不需要有寫程式就是要拿蘋果的焦慮感。 話雖如此,為了實際驗證都市傳說,我找回了自從開始打遊戲就被扔在角落,2015 年初版 Mac book,運氣不錯,剛好在支援清單內,現在就讓我們一起感受,標榜軟硬整合、使用者體驗的蘋果電腦能帶來的威力吧。 安裝環境是每位工程師避之唯恐不及的苦差事,如果你還沒有體驗到可能是你有個工具人好朋友,在程式語言中重複的事情可以抽出成為函數,現在把視野放遠,要快速安裝好環境你可以寫 shell script,就靠自己寫成文章,送給未來的你一點小確幸吧。 Terminal 終端機 相較於視窗程式採用GUI環境操作,透過滑鼠點擊元素,終端機採用CLI介面操作,接受指令的速度有著天壤之別,想想在LOL裡,你會用滑鼠點擊技能列再施放嗎 行有餘力可以學學 Vi/Vim 讓你不明覺厲 iTerm2 相較於系統原生的 Terminal,有更多的設定可以調整。 https://iterm2.com/ zsh 相較於原生的 Bash shell,有著更豐富的設定。 oh-my-zsh 讓 zsh 聲名大噪的套件,擁有華麗的畫面與各種快速鍵設定、錯誤提示等。 https://ithelp.ithome.com.tw/articles/10192899 https://medium.com/statementdog-engineering/prettify-your-zsh-command-line-prompt https://github.com/romkatv/powerlevel10k Homebrew https://brew.sh/index_zh-tw.html 套件管理系統 RVM Ruby 的版本管理系統,讓你針對專案快速切換不同版本。 https://rvm.io/ 從色彩繽紛到只看亂碼日子,學程式從 Ruby 出發! | Day 02 | 環境安裝 不可少的 RVM GPG 簽章驗證,好像 Mac 預設沒安裝。 https://gnupg.org/ https://zh....

2022, August 14 · 2 min · 301 words · Me

Memorization

什麼情境 在網站開發過程中,除了是靜態網頁(例如現在觀看的部落格)之外,免不了會有依使用者瀏覽行為,而動態響應的資料。 常見的動態資料來源有 JS 動態產生 向內部資料庫查詢 向外部網站查詢 而當程式重複執行條件相同的查詢時,雖然會因資料庫設計,返回快取結果,但如果能在本地確認這筆查詢已經做過,並直接讀取,即可加速網站讀取的速度。 這種記錄執行結果並在之後可以重複讀取的手法便稱為 Memorization 。 如何使用 例如在頁面中利用方法 current_user 來向資料庫查詢並回傳一個 User 物件,並在頁面中多次呼叫 current_user 來產生 User 相關的資料,為了避免重複查詢資料庫,可以將以下程式碼 1 2 3 def current_user @_user = User.find_by(id: session[:user_session]) end 修改成 1 2 3 def current_user @_user ||= User.find_by(id: session[:user_session]) end 其中的 A ||= B 等價於 A = (A || B) 因為在 ||(or) 判斷中,由左至右,如果元素為真(Truthy),則返回該元素,之後的程式碼將略過不執行,以此來看上面執行的結果, current_user 的回傳值會是: 若 @_user 為真,回傳 @_user ,否則回傳 User.find_by(id: session[:user_session]) 對於網站來說,假設一個搜尋站內商品的輸入框,透過觀察使用者輸入文字變化後,至後臺撈取符合前綴的查詢結果,渲染至畫面上以表現 autocomplete 的效果。此時便能以 Memorization 手法記錄曾經查詢的結果,當使用者按下刪除鍵移除字元時,不須再次查詢資料庫而是從記憶體直接取出。 順帶一提 在處理遞迴程式碼時,如果觀察到拆解出的部分結果都相等,也可以運用此手法加速並降低呼叫堆疊數。以經典的遞迴題目-求費氏數列的值為例...

2022, August 6 · 1 min · 167 words · Me