Upgrade to Pro — share decks privately, control downloads, hide ads and more …

20210521_出張!Railsウォッチ in 銀座Rails#33

20210521_出張!Railsウォッチ in 銀座Rails#33

37b01da9150c1e789f35771b06d36890?s=128

Masato Mori

May 21, 2021
Tweet

Transcript

  1. 出張!Railsウォッチ
 in 銀座Rails#33
 森 雅智 / @morimorihoge 2021/05/21 1
 特集:~Rails

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

  2. 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

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


  4. これまでの出張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 

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


  6. 概要
 6
 • EdgeなRailsを追いかけるぜ
 • 時期バージョン7.0に関する基本的な内容のおさらい
 • 新機能の追いかけ方など
 • 開発中のRails

    7.0から独断と偏見により気になった機能をピックアップ
 注意!
 Rails 7.0はまだリリース時期すら未定な状況です。本発表の内容はリリース時には変更さ れたりなくなっている可能性が大いにあります

  7. 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 

  8. 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る) 

  9. @morimorihogeが気になった機能
 9


  10. 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

  11. 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

  12. 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

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


    • 複数DBを使う時には覚えておくとよさそう
 13

  14. 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 

  15. その他気になったもの
 • 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

  16. まだよく分からないRails7のポイント
 • 何かと話題のHotwireはRailsに統合されるのか?
 ◦ 今のところは入ってないけど、近年はBasecamp発でAction CableやAction Text、Action Mailboxが 入ってきているのであり得ない話ではなさそう 


    ◦ ※今はhotwired/hotwire-railsリポジトリにある 
 • いつリリースされるのか?
 ◦ まだまだ不明。Ruby 3.1の方が先になりそう? 
 16
 Railsリポジトリの7.0 Milestone 
 ※ただし、進捗率はあまりアテにできないと思われる 

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

    とにかくオススメ!
 17

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