SlideShare una empresa de Scribd logo
1 de 22
Descargar para leer sin conexión
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のプロダクトに興味があれば
ぜひお声掛けください!🍖
おわり

Más contenido relacionado

La actualidad más candente

Mongo dbを知ろう
Mongo dbを知ろうMongo dbを知ろう
Mongo dbを知ろう
CROOZ, inc.
 
BDD勉強会 第6回
BDD勉強会 第6回BDD勉強会 第6回
BDD勉強会 第6回
zakihaya
 

La actualidad más candente (20)

MongoDBが遅いときの切り分け方法
MongoDBが遅いときの切り分け方法MongoDBが遅いときの切り分け方法
MongoDBが遅いときの切り分け方法
 
MongoDBの監視
MongoDBの監視MongoDBの監視
MongoDBの監視
 
webエンジニアのためのはじめてのredis
webエンジニアのためのはじめてのrediswebエンジニアのためのはじめてのredis
webエンジニアのためのはじめてのredis
 
Pythonとパッケージングと私
Pythonとパッケージングと私Pythonとパッケージングと私
Pythonとパッケージングと私
 
Mongo dbを知ろう
Mongo dbを知ろうMongo dbを知ろう
Mongo dbを知ろう
 
Hadoop -NameNode HAの仕組み-
Hadoop -NameNode HAの仕組み-Hadoop -NameNode HAの仕組み-
Hadoop -NameNode HAの仕組み-
 
GraalVMの多言語実行機能が凄そうだったので試しにApache Sparkに組み込んで動かしてみたけどちょっとまだ早かったかもしれない(Open So...
GraalVMの多言語実行機能が凄そうだったので試しにApache Sparkに組み込んで動かしてみたけどちょっとまだ早かったかもしれない(Open So...GraalVMの多言語実行機能が凄そうだったので試しにApache Sparkに組み込んで動かしてみたけどちょっとまだ早かったかもしれない(Open So...
GraalVMの多言語実行機能が凄そうだったので試しにApache Sparkに組み込んで動かしてみたけどちょっとまだ早かったかもしれない(Open So...
 
BDD勉強会 第6回
BDD勉強会 第6回BDD勉強会 第6回
BDD勉強会 第6回
 
JSON:APIについてざっくり入門
JSON:APIについてざっくり入門JSON:APIについてざっくり入門
JSON:APIについてざっくり入門
 
これからのJDK/JVM 何を選ぶ?どう選ぶ?
これからのJDK/JVM 何を選ぶ?どう選ぶ?これからのJDK/JVM 何を選ぶ?どう選ぶ?
これからのJDK/JVM 何を選ぶ?どう選ぶ?
 
RDB開発者のためのApache Cassandra データモデリング入門
RDB開発者のためのApache Cassandra データモデリング入門RDB開発者のためのApache Cassandra データモデリング入門
RDB開発者のためのApache Cassandra データモデリング入門
 
Node.jsで使えるファイルDB"NeDB"のススメ
Node.jsで使えるファイルDB"NeDB"のススメNode.jsで使えるファイルDB"NeDB"のススメ
Node.jsで使えるファイルDB"NeDB"のススメ
 
明日からはじめられる Docker + さくらvpsを使った開発環境構築
明日からはじめられる Docker + さくらvpsを使った開発環境構築明日からはじめられる Docker + さくらvpsを使った開発環境構築
明日からはじめられる Docker + さくらvpsを使った開発環境構築
 
Dockerの期待と現実~Docker都市伝説はなぜ生まれるのか~
Dockerの期待と現実~Docker都市伝説はなぜ生まれるのか~Dockerの期待と現実~Docker都市伝説はなぜ生まれるのか~
Dockerの期待と現実~Docker都市伝説はなぜ生まれるのか~
 
RestfulなAPIの設計のお話
RestfulなAPIの設計のお話RestfulなAPIの設計のお話
RestfulなAPIの設計のお話
 
[Node-RED] ファンクションノードのデバッグどうしてる?
[Node-RED] ファンクションノードのデバッグどうしてる?[Node-RED] ファンクションノードのデバッグどうしてる?
[Node-RED] ファンクションノードのデバッグどうしてる?
 
JavaScript GIS ライブラリ turf.js 入門
JavaScript GIS ライブラリ turf.js 入門JavaScript GIS ライブラリ turf.js 入門
JavaScript GIS ライブラリ turf.js 入門
 
Zabbix による ms sql監視 ~データベースモニタリング~ odbc
Zabbix による ms sql監視 ~データベースモニタリング~ odbcZabbix による ms sql監視 ~データベースモニタリング~ odbc
Zabbix による ms sql監視 ~データベースモニタリング~ odbc
 
Introduction to Spark Internals
Introduction to Spark InternalsIntroduction to Spark Internals
Introduction to Spark Internals
 
Dockerで始める Java EE アプリケーション開発 for JJUG CCC 2017
Dockerで始める Java EE アプリケーション開発 for JJUG CCC 2017Dockerで始める Java EE アプリケーション開発 for JJUG CCC 2017
Dockerで始める Java EE アプリケーション開発 for JJUG CCC 2017
 

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

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
Koichiro Ohba
 

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

The First React on Rails
The First React on Rails The First React on Rails
The First React on Rails
 
RailsでReact.jsを動かしてみた話
RailsでReact.jsを動かしてみた話RailsでReact.jsを動かしてみた話
RailsでReact.jsを動かしてみた話
 
【入門】3時間でアプリ公開!ゼロからのプログラミングRails講座
【入門】3時間でアプリ公開!ゼロからのプログラミングRails講座【入門】3時間でアプリ公開!ゼロからのプログラミングRails講座
【入門】3時間でアプリ公開!ゼロからのプログラミングRails講座
 
クラスメソッド第4回登壇資料 RxRealm
クラスメソッド第4回登壇資料 RxRealmクラスメソッド第4回登壇資料 RxRealm
クラスメソッド第4回登壇資料 RxRealm
 
ふつうのRailsアプリケーション開発
ふつうのRailsアプリケーション開発ふつうのRailsアプリケーション開発
ふつうのRailsアプリケーション開発
 
フレームワーク品評会 Ruby on Rails #crossjp
フレームワーク品評会 Ruby on Rails #crossjpフレームワーク品評会 Ruby on Rails #crossjp
フレームワーク品評会 Ruby on Rails #crossjp
 
RESTからGraphQL APIへの移行で学んだこと.pptx
RESTからGraphQL APIへの移行で学んだこと.pptxRESTからGraphQL APIへの移行で学んだこと.pptx
RESTからGraphQL APIへの移行で学んだこと.pptx
 
Ruby on Rails を用いたWEBアプリケーションの開発
Ruby on Rails を用いたWEBアプリケーションの開発Ruby on Rails を用いたWEBアプリケーションの開発
Ruby on Rails を用いたWEBアプリケーションの開発
 
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が三ヶ月生き延びた話
Rubyの会社でPythonistaが三ヶ月生き延びた話Rubyの会社でPythonistaが三ヶ月生き延びた話
Rubyの会社でPythonistaが三ヶ月生き延びた話
 
Rubyの会社でPythonistaが3ヶ月生き延びた話
Rubyの会社でPythonistaが3ヶ月生き延びた話Rubyの会社でPythonistaが3ヶ月生き延びた話
Rubyの会社でPythonistaが3ヶ月生き延びた話
 
ゼロからのプログラミング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入門
 

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