SlideShare a Scribd company logo
1 of 22
Download to read offline
Rails7.1の新機能が使いた
くて調べてみた
【Techouse×Leaner共同開催】Ruby/Rails勉強会
2024/01/19Fri.@glico800
登壇者情報
@glico800
LeanerTechnologiesInc.
デザインエンジニア
フロントエンドの実装が中心
バックエンドも勉強中
TypeScript,React,Ruby,RubyonRails
動物好き
ちょっと会社の話(1/2)
LeanerTechnologiesInc.は調達DXの会社
Leaner見積とLeaner購買という2つのプロダクト
ちょっと会社の話(2/2)
私はLeaner購買の開発チーム
Leaner購買は Rails 7.1.1
せっかくチームがアップデートを頑張ってくれているので
Rails7.1の新機能が
使いたい!!
もくじ
1. ActiveRecord::Base.normalizes
2. 汎用の非同期クエリを対象とするActiveRecordAPI
3. まとめ
個人的に業務に使いそうな機能をピックアップ
1. ActiveRecord::Base.normalizes
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
正規化のタイミング(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"
正規化のタイミング(2/3)
ActiveRecord::FinderMethods
1 User.find_by(email: "cruise-control@example.com").count # => 1
2
3 # キーワード引数には適用される
4 User.find_by(email: "tCRUISE-CONTROL@EXAMPLE.COM ").count # => 1
5 User.where(email: "tCRUISE-CONTROL@EXAMPLE.COM ").count # => 1
6 User.exists?(email: "tCRUISE-CONTROL@EXAMPLE.COM ") # => true
7
8 # プレースホルダには適用されない
9 User.where(["email = ?", "tCRUISE-CONTROL@EXAMPLE.COM "]).count # => 0
10 User.exists?(["email = ?", "tCRUISE-CONTROL@EXAMPLE.COM "]) # => false
正規化のタイミング(3/3)
明示的に呼ぶ
Model.normalize_value_for から呼ぶことも可
see:activerecord/lib/active_record/normalization.rb
1 # normalizes の追加前に保存された値は正規化されない
2 legacy_user = User.find(1)
3 legacy_user.email # => " CRUISE-CONTROL@EXAMPLE.COMn"
4
5 # 明示的に呼ぶことで正規化
6 legacy_user.normalize_attribute(:email)
7 legacy_user.email # => "cruise-control@example.com"
8 legacy_user.save
1 User.normalize_value_for(:email, " CRUISE-CONTROL@EXAMPLE.COMn")
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
2.汎用の非同期クエリを対象とする
ActiveRecordAPI
非同期クエリがサポート拡張
集計メソッド
async_count , async_count_by_sql
async_minimum , async_maximum
async_sum
async_average
検索メソッド
async_pick
async_find_by_sql
async_pluck
async_ids
使い方
非同期なカウント
同期的なカウント
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
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)
config/application.rb
1. async_query_executor
これを設定しないと非同期クエリが流れない
2.global_executor_concurrency
async_query_executor が :global_thread_pool のときの並行実行数上限
上限アップの際はサーバーリソースと要相談
1 # 設定値は :global_thread_pool or :multi_thread_pool (初期値: nil)
2 config.active_record.async_query_executor = :global_thread_pool
1 # (初期値: 4)
2 config.active_record.global_executor_concurrency = 5
どんなときに使いそうか
データ分析機能
重いクエリを複数実行する
ActiveRecord::Relation を返さないメソッドが多い
集計期間が長い集計機能ほど恩恵が大きい
例:Leaner見積の年間コストインパクト等の算出
(↑開発合宿で実際にパフォーマンス向上に成功していた)
今回の非同期クエリの実装者はShopifyのエンジニアさん
(Shopifyでも使っているのかも)
まとめ
Rails7.1でよく使いそうな新機能
ActiveRecord::Base.normalizes での正規化
before_validation を使って書くより簡単
キーワード引数以外の ActiveRecord::FinderMethods は正規化されない
normalizesの追加前に保存された値は正規化されない
汎用の非同期クエリを対象とするActiveRecordAPI
load_async ではできなかった集計処理が非同期化できる
async_query_executor の設定を忘れずに
データ分析機能で活躍しそう
一緒に働くエンジニアを募
集しています!
Leanerのプロダクトに興味があれば
ぜひお声掛けください!🍖
おわり

More Related Content

Similar to Rails 7.1 の新機能が使いたくて調べてみた@【Techouse × Leaner共同開催】Ruby / Rails勉強会

Railsチュートリアル(second)を終えて
Railsチュートリアル(second)を終えてRailsチュートリアル(second)を終えて
Railsチュートリアル(second)を終えてHirata Tomoko
 
The Essence of Using Ruby on Rails in Corporations
The Essence of Using Ruby on Rails in CorporationsThe Essence of Using Ruby on Rails in Corporations
The Essence of Using Ruby on Rails in CorporationsKoichiro Ohba
 
rablについてざっくりだけ調べてみた #shinjukurb 新宿rb 41th
rablについてざっくりだけ調べてみた #shinjukurb 新宿rb 41thrablについてざっくりだけ調べてみた #shinjukurb 新宿rb 41th
rablについてざっくりだけ調べてみた #shinjukurb 新宿rb 41thKoichiro Sumi
 
2017年3月13日勉強会発表資料
2017年3月13日勉強会発表資料2017年3月13日勉強会発表資料
2017年3月13日勉強会発表資料shogo yamada
 
Rubyの会社でPythonistaが3ヶ月生き延びた話
Rubyの会社でPythonistaが3ヶ月生き延びた話Rubyの会社でPythonistaが3ヶ月生き延びた話
Rubyの会社でPythonistaが3ヶ月生き延びた話Tokoroten Nakayama
 
Rubyの会社でPythonistaが三ヶ月生き延びた話
Rubyの会社でPythonistaが三ヶ月生き延びた話Rubyの会社でPythonistaが三ヶ月生き延びた話
Rubyの会社でPythonistaが三ヶ月生き延びた話Drecom Co., Ltd.
 
ゼロからのプログラミングRails講座 Codeanywhere版
ゼロからのプログラミングRails講座 Codeanywhere版ゼロからのプログラミングRails講座 Codeanywhere版
ゼロからのプログラミングRails講座 Codeanywhere版DIVE INTO CODE Corp.
 
ApplicationTemplateのススメ
ApplicationTemplateのススメApplicationTemplateのススメ
ApplicationTemplateのススメTakafumi ONAKA
 
Rubyによる開発プロジェクトをうまく回すには(1)
Rubyによる開発プロジェクトをうまく回すには(1)Rubyによる開発プロジェクトをうまく回すには(1)
Rubyによる開発プロジェクトをうまく回すには(1)Yasuko Ohba
 
React.js・ReactNative・Redux入門
React.js・ReactNative・Redux入門React.js・ReactNative・Redux入門
React.js・ReactNative・Redux入門Kazuhiro Yoshimoto
 
[RubyMotion LT] nitronに見るiosアプリ開発の未来
[RubyMotion LT] nitronに見るiosアプリ開発の未来[RubyMotion LT] nitronに見るiosアプリ開発の未来
[RubyMotion LT] nitronに見るiosアプリ開発の未来Masahiro Nishimi
 
デザインパターンを用いたリファクタリング
デザインパターンを用いたリファクタリングデザインパターンを用いたリファクタリング
デザインパターンを用いたリファクタリングkei takakuda
 
Rails composerでrails newを楽にしよう
Rails composerでrails newを楽にしようRails composerでrails newを楽にしよう
Rails composerでrails newを楽にしよう健太 田上
 
React.jsでサービスを作ってみた話
React.jsでサービスを作ってみた話React.jsでサービスを作ってみた話
React.jsでサービスを作ってみた話GIG inc.
 
Pry による repl 駆動開発について
Pry による repl 駆動開発についてPry による repl 駆動開発について
Pry による repl 駆動開発についてTomoya Kawanishi
 
Tokyo ruby kaigi 10 (sogabe)
Tokyo ruby kaigi 10 (sogabe)Tokyo ruby kaigi 10 (sogabe)
Tokyo ruby kaigi 10 (sogabe)Takashi Sogabe
 
そのRails Engine、 本当に必要ですか?
そのRails Engine、 本当に必要ですか?そのRails Engine、 本当に必要ですか?
そのRails Engine、 本当に必要ですか?nixiesan
 
Develop simpleappwithreacthooks
Develop simpleappwithreacthooksDevelop simpleappwithreacthooks
Develop simpleappwithreacthooksGenki Amagata
 

Similar to Rails 7.1 の新機能が使いたくて調べてみた@【Techouse × Leaner共同開催】Ruby / Rails勉強会 (20)

Railsチュートリアル(second)を終えて
Railsチュートリアル(second)を終えてRailsチュートリアル(second)を終えて
Railsチュートリアル(second)を終えて
 
The Essence of Using Ruby on Rails in Corporations
The Essence of Using Ruby on Rails in CorporationsThe Essence of Using Ruby on Rails in Corporations
The Essence of Using Ruby on Rails in Corporations
 
rablについてざっくりだけ調べてみた #shinjukurb 新宿rb 41th
rablについてざっくりだけ調べてみた #shinjukurb 新宿rb 41thrablについてざっくりだけ調べてみた #shinjukurb 新宿rb 41th
rablについてざっくりだけ調べてみた #shinjukurb 新宿rb 41th
 
2017年3月13日勉強会発表資料
2017年3月13日勉強会発表資料2017年3月13日勉強会発表資料
2017年3月13日勉強会発表資料
 
Rubyの会社でPythonistaが3ヶ月生き延びた話
Rubyの会社でPythonistaが3ヶ月生き延びた話Rubyの会社でPythonistaが3ヶ月生き延びた話
Rubyの会社でPythonistaが3ヶ月生き延びた話
 
Rubyの会社でPythonistaが三ヶ月生き延びた話
Rubyの会社でPythonistaが三ヶ月生き延びた話Rubyの会社でPythonistaが三ヶ月生き延びた話
Rubyの会社でPythonistaが三ヶ月生き延びた話
 
ゼロからのプログラミングRails講座 Codeanywhere版
ゼロからのプログラミングRails講座 Codeanywhere版ゼロからのプログラミングRails講座 Codeanywhere版
ゼロからのプログラミングRails講座 Codeanywhere版
 
ApplicationTemplateのススメ
ApplicationTemplateのススメApplicationTemplateのススメ
ApplicationTemplateのススメ
 
Rubyによる開発プロジェクトをうまく回すには(1)
Rubyによる開発プロジェクトをうまく回すには(1)Rubyによる開発プロジェクトをうまく回すには(1)
Rubyによる開発プロジェクトをうまく回すには(1)
 
React introduntion
React introduntionReact introduntion
React introduntion
 
組込み向けRuby処理系mrubyの可能性
組込み向けRuby処理系mrubyの可能性組込み向けRuby処理系mrubyの可能性
組込み向けRuby処理系mrubyの可能性
 
React.js・ReactNative・Redux入門
React.js・ReactNative・Redux入門React.js・ReactNative・Redux入門
React.js・ReactNative・Redux入門
 
[RubyMotion LT] nitronに見るiosアプリ開発の未来
[RubyMotion LT] nitronに見るiosアプリ開発の未来[RubyMotion LT] nitronに見るiosアプリ開発の未来
[RubyMotion LT] nitronに見るiosアプリ開発の未来
 
デザインパターンを用いたリファクタリング
デザインパターンを用いたリファクタリングデザインパターンを用いたリファクタリング
デザインパターンを用いたリファクタリング
 
Rails composerでrails newを楽にしよう
Rails composerでrails newを楽にしようRails composerでrails newを楽にしよう
Rails composerでrails newを楽にしよう
 
React.jsでサービスを作ってみた話
React.jsでサービスを作ってみた話React.jsでサービスを作ってみた話
React.jsでサービスを作ってみた話
 
Pry による repl 駆動開発について
Pry による repl 駆動開発についてPry による repl 駆動開発について
Pry による repl 駆動開発について
 
Tokyo ruby kaigi 10 (sogabe)
Tokyo ruby kaigi 10 (sogabe)Tokyo ruby kaigi 10 (sogabe)
Tokyo ruby kaigi 10 (sogabe)
 
そのRails Engine、 本当に必要ですか?
そのRails Engine、 本当に必要ですか?そのRails Engine、 本当に必要ですか?
そのRails Engine、 本当に必要ですか?
 
Develop simpleappwithreacthooks
Develop simpleappwithreacthooksDevelop simpleappwithreacthooks
Develop simpleappwithreacthooks
 

Rails 7.1 の新機能が使いたくて調べてみた@【Techouse × Leaner共同開催】Ruby / Rails勉強会