일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 日本語
- 一日一つメソッド
- 비즈니스일본어
- 일본어
- Web
- vscode
- html
- 자바
- rails7
- 인프런
- 건담베이스
- javascript
- Spring
- springboot
- rails
- 건담
- 연습문제
- DART
- C로 시작하는 컴퓨터 프로그래밍4판
- CSS
- Flutter
- 반다이몰
- nico
- メソッド
- ruby
- 単語
- 디지몬
- jsp
- java
- Python
Archives
- Today
- Total
AR삽질러
Rails 一日一つメソッド (Day50) Active Record(7) - before_commit, after_commit 본문
Ruby/RubyOnRails-日本語
Rails 一日一つメソッド (Day50) Active Record(7) - before_commit, after_commit
아랑팡팡 2024. 3. 11. 11:29728x90
Rails 一日一つメソッド (Day50) Active Record(7) - before_commit, after_commit
1. before_commit, after_commit
- RailsのActive Recordコールバックの一つとして、トランザクションがCommitされる 「前」、「後」に実行されるメソッドで、オブジェクトの変更がDataBaseに永久的に反映される前と後に追加作業行うことになる。
2. before_commit
- トランザクションがCommitされる前に行われ、Modelのオブジェクトの変更がDataBaseに永久的に反映される前に実行され、変更の確認、追加作業を行う。
2-1) Modelに before_commit追加
class User < ApplicationRecord
before_commit :some_before_commit
private
def some_before_commit
puts "before_commit実行"
end
end
user = User.new(name: "Arang")
user.save
# some_before_commit 出力
2-2) Userが入力したEmailを normalizeする。
class User < ApplicationRecord
before_commit :normalize_before_commit
private
def normalize_before_commit
self.email = email.downcase.strip if email.present?
end
end
Emailを正規化し、Emailを小文字で変更し、空白を削除してDataBaseに保存されるときに、一貫性を持って保存される。
user = User.new(name: "Arang", email: "ARANG@example.com")
user.save
# arang@example.com
3. after_commit
- トランザクションが完了し、DataBaseにCommitされた後に、実行されるメソッドで、after_commitで、Dataが保存された後の作業を行うことができる。
class User < ApplicationRecord
after_commit :send_welcome_email, on: :create
private
def send_welcome_email
UserMailer.welcome_email(self).deliver_later
end
end
Userが生成された後、after_commitのsend_welcome_emailメソッドが実行されUserにMailを送る。.deliver_later : deliver_nowとは違う、非同期的に送信する方法で、バックグラウンドで処理され、ウェブ リクエストをブロックせずにユーザーにすぐ送信する。
728x90
반응형
LIST