Más contenido relacionado La actualidad más candente (20) Similar a Rails 7.1 の新機能が使いたくて調べてみた@【Techouse × Leaner共同開催】Ruby / Rails勉強会 (20) Rails 7.1 の新機能が使いたくて調べてみた@【Techouse × Leaner共同開催】Ruby / Rails勉強会8. ActiveRecord::Base.normalizes で正規化
before
after
1 class User < ActiveRecord::Base
2 before_validation :normalize_email
3
4 private
5
6 def normalize_email
7 email.strip.downcase
8 end
9 end
1 class User < ActiveRecord::Base
2 normalizes :email, with: -> email { email.strip.downcase }
3 end
9. 正規化のタイミング(1/3)
attributeのassign/update
1 user = User.find(1)
2 user.email = " CRUISE-CONTROL@EXAMPLE.COMn"
3 user.email # => "cruise-control@example.com"
4
5 user.update(email: " UPDATED-CRUISE-CONTROL@EXAMPLE.COMn")
6 user.email # => "updated-cruise-control@example.com"
12. nil の扱い
apply_to_nil オプションを付けると nil のときも正規化される
nil のときは正規化は適用されないのでエラーにはならない
1 class User < ActiveRecord::Base
2 # デフォルトでは nil 考慮は不要
3 normalizes :email, with: -> email { email.strip.downcase }
4 end
3 normalizes :email, with: -> email { email&.strip&.downcase }, apply_to_nil: true
1 class User < ActiveRecord::Base
2 # nil の考慮が必要になる
4 end
15. 使い方
非同期なカウント
同期的なカウント
1 published_count = Post.where(published: true).count # => 10
2
3 # 他の処理たち...
4
5 published_count
1 # <ActiveRecord::Promise status=pending> を返す
2 promise = Post.where(published: true).async_count
3
4 # 他の処理たち...
5
6 promise.value # => 10
16. load_async との違い
逆に ActiveRecord::Relation を返さないメソッドでは load_async は使えない
ActiveRecord::Relation を返すメソッドでは load_async が使える
1 orders = Order.where(user_id: user.id).load_async
2 requisitions = user.requisitions.approved.load_async
1 # NG => undefined method `load_async' for ...
2 ng_count = Order.shipped.count.load_async
3 ng_requisition_ids = Requisition.approved.pluck(:id).load_async
4
5 # OK
6 count = Order.shipped.async_count
7 requisition_ids = Requisition.approved.async_pluck(:id)