Slide 1

Slide 1 text

出張!Railsウォッチ
 in 銀座Rails#33
 森 雅智 / @morimorihoge 2021/05/21 1
 特集:~Rails 7.0で入る予定の新機能(暫定版)~
 
 


Slide 2

Slide 2 text

About Me
 ● 森 雅智: @morimorihoge
 ● BPS株式会社でRailsの受託開発チームをやってたり、週1大学非常勤で Web開発を教えてたりします
 ● Ruby/Rails歴は11年くらい。Web開発は17年くらい
 ● 銀座Ralis #10でActiveRecordでVIEWを使おうという話をしました
 ● 銀座Rails #27でアプリケーションコンフィグの話をしました
 About BPS & TechRacho
 ● Web受託開発や電子書籍製品開発をやっている会社です
 ● TechRachoという自社技術Blogを運営しています
 ○ 5年ほど前から平日毎日更新してます
 ○ https://techracho.bpsinc.jp/ ● お仕事相談、転職相談、TechRachoへのご意見など気軽にどうぞ
 ○ https://www.bpsinc.jp/ 2


Slide 3

Slide 3 text

Railsウォッチとは?
 技術ブログTechRachoで毎週連載しているRails / Ruby界隈を中 心とした雑多な情報を提供する技術雑談マガジン
 3


Slide 4

Slide 4 text

これまでの出張Railsウォッチのピックアップテーマ
 ● 銀座Rails#12: 複数DB対応
 ● 銀座Rails#13: ActionText、Trix
 ● 銀座Rails#14: ActionMailbox
 ● 銀座Rails#15: production、development、staging環境について
 ● 銀座Rails#16: 機能開発の設計レビューについて
 ● 銀座Rails#17: リソース管理スコープについて
 ● 銀座Rails#19: 開発チームの冗長化について
 ● 銀座Rails#20: Excelと仲良くしよう
 ● 銀座Rails#21: 標準仕様を読むためのABNF
 ● 銀座Rails#22: CLIプログラムにOptionParserを使う
 ● 銀座Rails#23: ActiveRecordのSELECTベンチマーク
 ● 銀座Rails#24: 令和Devise事情
 ● 銀座Rails#28: 2020年の銀座Railsを振り返る
 ● 銀座Rails#29: Serverless Railsを試す
 ● 銀座Rails#30: Railsインフラ環境Overview
 ● 銀座Rails#31: Railsプロジェクトあるある
 ● 銀座Rails#32: MimeMagic騒動を振り返る
 4
 各回資料に興味がある方はこちらからどうぞ:https://speakerdeck.com/morimorihoge 


Slide 5

Slide 5 text

Rails 7.0で入る予定の新機能(暫定版)
 5


Slide 6

Slide 6 text

概要
 6
 ● EdgeなRailsを追いかけるぜ
 ● 時期バージョン7.0に関する基本的な内容のおさらい
 ● 新機能の追いかけ方など
 ● 開発中のRails 7.0から独断と偏見により気になった機能をピックアップ
 注意!
 Rails 7.0はまだリリース時期すら未定な状況です。本発表の内容はリリース時には変更さ れたりなくなっている可能性が大いにあります


Slide 7

Slide 7 text

Rails 7.0の基本情報
 ● 2019年8月の6.0.0リリース以来のメジャーアップデート
 ● required Rubyが2.7.0+、3.0+ prefferedに更新(6.xは2.5.0+)
 ● 最新情報をサクッと見たければ最新のmainブランチから生成されているEdge Rails Guidesの7.0 Release Notesを見ると良い
 ○ https://edgeguides.rubyonrails.org/7_0_release_notes.html 
 ○ 最新changelogへのリンク集になっている 
 7
 Railsのバージョンポリシーの話は @yahonda さんの銀座Rails #29のスライドがわかりやすいです 
 参考:https://speakerdeck.com/yahonda/ruby-3-dot-0torails-6-dot-1false-sapoto-matorikusu 


Slide 8

Slide 8 text

Changelogの辿り方
 ● rails/railsリポジトリ内の各主要GemディレクトリにCHANGELOG.mdがあり、ここには 一つ前のリリースバージョンからの差分がまとまっている
 ○ mainなら6-1-stable以降の差分 
 ○ 6-1-stableブランチなら6-0-stableからの差分 
 ○ 6-0-stableブランチなら5-2-stable 
 ● changelogの内容を見てイマイチよく分からない場合はmerge元のPRを見ると、その 変更差分に対応するテストコードが分かるので理解の助けになる
 ● changelogに対応するPR idが書いてあることもあるが、ない場合にはgit blameして commit idやcommitログから追いかけると良い
 ○ commitコメント中にPR参照が書いてあったり 
 ○ commit idでGitHub検索してPRを逆引きしたり 
 8
 実際に見てみましょう(ブラウザ&RubyMineそれぞれでDemoる) 


Slide 9

Slide 9 text

@morimorihogeが気になった機能
 9


Slide 10

Slide 10 text

Implement Relation#load_async to schedule the query on the background thread pool #41372
 ● 1リクエストの中でDBの問い合わせ処理部分をマルチスレッド化して非同期待ち合 わせできるようにする(デフォルトはOFF)
 ● 例えばこんなことができる
 ○ 重いクエリAとBとCを同時に実行し、待ち合わせ処理 
 ● 1リクエストをマルチスレッド・複数connectionで処理するため、クエリ間でトランザク ションが張れない、connection_poolをスレッド数以上使うので設定に注意が必要そ うなどあるが、うまくハマれば非常に強力そう
 10


Slide 11

Slide 11 text

Add encryption to Active Record #41659
 ● ARにデータ暗号化機能が追加
 ○ これまではattr_encrypted gemを使ってやっていたようなやつ 
 ● Guidesもしっかり書かれており、機能も十分に豊富
 ● deterministic(確定的) or non-deterministicを選べたり
 ○ ※確定的暗号化=暗号化結果が常に同じ。デフォルトはnon-deterministic 
 ● 鍵変更のための機能が用意されていたり
 ○ previous keyとの並行運用ができる 
 ● BasecampのHEYで既に使われていてproduction readyとのこと
 ○ security firmのレビューもされているとのことなので、普通に使ってよさそう 
 11


Slide 12

Slide 12 text

Add setting for enumerating column names in SELECT statements #41718
 ● SELECT系メソッドを実行する際、通常は`SELECT *`が発行されるが、`*`を使わず カラム名を展開するようになるオプションenumerate_columns_in_select_statements を設定できるように
 ○ `config.active_record.enumerate_columns_in_select_statements = true` だと全ARモデルに適用 
 ○ 各Modelごとなら`self.enumerate_columns_in_select_statements = true`でできる 
 ● 実装の同期としてはPostgreSQL環境でPreparedStatementCacheExpiredが発生す るケースの回避のためだが、BEツールやメンテ用のSQLを組み立てる時なんかに これを使ってto_sqlすると便利かもしれない
 12


Slide 13

Slide 13 text

has_one, has_manyにdisable_joinsオプションが追加 #41937 #42079 
 ● 複数DB環境で、直接SQL的にJOINできないARモデル同士をhas_(one|many)すると きに設定すると、JOINを使わずSQLを分解して発行してくれるオプション
 ● 異なるRDBMSのARモデル同士でもActiveRecord的に書けるようになる
 ● 複数DBを使う時には覚えておくとよさそう
 13


Slide 14

Slide 14 text

Add config.action_view.image_loading #38452
 ● imgタグにデフォルトでloading=”lazy”を付けるようになった
 ○ loading: ‘eager’ などの直接指定も可能 
 ● ブラウザのlazy loading機能を使うもので、修正差分は小さいが、地味に効いてきそ うな変更に思える
 ● ユーザー側の体感速度も向上するが、system testでheadless chromeなどを走らせ ていたりするサービスの場合にはテストも高速化するかもしれない
 ● すごい新機能!というわけではないが、ちりつも系改善ということでピックアップ
 14
 MDNのimgタグ説明より :https://developer.mozilla.org/ja/docs/Web/HTML/Element/img 


Slide 15

Slide 15 text

その他気になったもの
 ● Add `ActiveRecord::FinderMethods#sole` and `#find_sole_by` #40768
 ○ 1件しかないはずのレコードを取り出すときに#find, #find_byの代わりに使うことで、2件以上あった ときにAR::SoleRecordExceeded エラーをraiseする
 ○ 異常データの検知に地味に便利そう 
 ● Add `Enumerable#sole` #40914
 ○ #soleのEnumerable版。#findの代わりに使えるのも同じ 
 ● Expose an `invert_where` method that will invert all scope conditions. #40249
 ○ where.notのshorthand(where条件をひっくり返す)だが、scopeと併用すると想定外の挙動をしそう で物議を醸している
 ● Enumerable#in_order_of #41333
 ○ Enumerableを”任意の”順番で並べ替えることができる 
 ○ sort比較式のcomparatorをロジックで書きづらいようなケースで使えるかも 
 15


Slide 16

Slide 16 text

まだよく分からないRails7のポイント
 ● 何かと話題のHotwireはRailsに統合されるのか?
 ○ 今のところは入ってないけど、近年はBasecamp発でAction CableやAction Text、Action Mailboxが 入ってきているのであり得ない話ではなさそう 
 ○ ※今はhotwired/hotwire-railsリポジトリにある 
 ● いつリリースされるのか?
 ○ まだまだ不明。Ruby 3.1の方が先になりそう? 
 16
 Railsリポジトリの7.0 Milestone 
 ※ただし、進捗率はあまりアテにできないと思われる 


Slide 17

Slide 17 text

まとめ
 ● まだRails7のリリースまでは時間があるが、普段から追いかけておくことでアップグ レード時の心の準備ができるのでオススメ!
 ● Rails本家のコードを読むことは、普段Railsアプリのコードを書く参考にもなるのでオ ススメ!
 ● PRの中での議論もとても参考になるやりとりが満載なのでオススメ!
 ● とにかくオススメ!
 17


Slide 18

Slide 18 text

次回以降もブラッシュアップしていきます
 感想・リクエストなどあればTwitter
 #ginzarails
 @morimorihoge
 @hachi8833
 までお声かけください
 18