見出し画像

Kaigi on Rails 2022 感想

はじめに

2022/10/21-22 @オンラインで開催された Kaigi on Rails 2022 に参加しました!
セッションがたくさんあって、合間には Spacial Chat で参加者の皆さんとお話できて、学びも交流も深かった2日間でした!

セッション

良かったセッションばかりなのですが、特に気になった3つをピックアップさせていただきます。

@yahonda さんによる基調講演です。

Rails ってどういうプロセスを経て新しいバージョンがリリースされているのかというお話が聞けました。
セキュリティメンテナンスのフェーズに入ると、それまでのマイナーバージョンで起こってしまったと思われる regression でもそのバージョンでは修正しなかった。
というポリシーに基づいたお話もあり、いろんなことを考えられながら作られているんだなというのを実感しました。
そして、Rails に貢献するにはセキュリテイメンテナンスのフェーズに入る前にバグを見つけることが必要。ということは Rails のバージョンアップの手を止めてはいけないと強く感じました。
有識者の方が書いてくださったバージョンアップガイドもあります(もちろん公式も見ます)。
やらない理由がないですね。

また「プレビューバージョンが出たから手元で使ってみる」というのを Twitter とかで見たことがあるけれども、それっていったいどうやったらできるんだろう?
という疑問も解消できました!
gem の設定で直接ブランチを参照して取得するんですね。なるほど。


2つ目は、2日目最初の @fugakkbn さんのセッションです。

Ruby3.0から導入された型ですが、リリースされてからもうすぐ2年。使ってみたいと思いつつ全く使えていないままここまで来てしまいました。
しかし、この発表で型を導入してみても簡単に剥がすことができる。というのを聞いて、1つだけお試しで入れてみるのありでは?
と思いました。
やるなら全部に適用することになるから大変だ〜と思っていたところから、だいぶハードルが下がりやってみたい気持ちが MAX になりました。

ということで早速 gem を入れてみました。

Gemfile
bundle exec steep init
Steepfile

README をみながら Steepfile の生成までできました。
ここから、チェック対象と型付けをしていく感じですね。
ちょっとずつ進めていこうと思います。


3つ目は @osyo さんの ActiveRecord ::Relation のお話です。

ActiveRecord::Relation ってよくみますが、これって何?と言われるとわからないな〜と思っていました。
また、ActiveRecord が遅延評価であるということも、Rubyを使い始めてから2年くらい経つまで知らずにいました;;;
そういうときにどうやって定義を探しに行くのか、便利なメソッドとともにライブコーデイングスタイルで実際の参照などをみれたのがとても良かったです。

ここで、Rails では ApplicationRecord を継承したモデルって属性が全部メソッドになるのですが、あれは一体どういう仕組みなんだろう?
というのがずっと気になっていたのでこの発表を参考に調べてみました!

email をもつ User を作成します。

create_table :users do |t|
  t.string :email
end

登録された User のデータを取ってみます。

User.first
  User Load (5.1ms)  SELECT `users`.* FROM `users` ORDER BY `users`.`id` ASC LIMIT 1
=> #<User id: 1, email: "test@example.com">

上記発表でも紹介されていた `method` メソッドを使って `email` というメソッドが本当にあるのか見てみます。

User.first.method(:email)
=> #<Method: User(id: integer, email: string)(User::GeneratedAttributeMethods)#email()

ありました!
では定義がどこにあるのか見てみましょう。
これも紹介されていた `source_location` メソッドを使ってみます。

User.first.method(:email).source_location
=> ["/var/app/vendor/bundle/ruby/2.7.0/gems/activerecord-6.0.5/lib/active_record/attribute_methods/read.rb", 15]

(ちょっと古い環境でごめんなさい)
active_record /attribute_methods/read.rb の中にありそうです。
このファイルですね。

このファイルを見ると、private メソッドで以下の記述を見つけました。

def define_method_attribute(name, owner:)
  ActiveModel::AttributeMethods::AttrNames.define_attribute_accessor_method(
   owner, name
 ) do |temp_method_name, attr_name_expr|
   owner.define_cached_method(name, as: temp_method_name, namespace: :active_record) do |batch|
     batch <<
       "def #{temp_method_name}" <<
         "  _read_attribute(#{attr_name_expr}) { |n| missing_attribute(n, caller) }" <<
         "end"
       end
     end
   end

ここで各属性のメソッドを作っていそうな感じしますね!

具体的にこのコード内容を読むことは今回はしませんが、どこでよしなにやってくれるのかをこうやって辿るのか!というのが勉強になりましたし、これまで疑問に思っていた属性を method 化していそうな場所の特定もできました!

明日から使える知識をいただけて本当に感謝です。

まとめ

ここ2年間はオンラインのみのイベントでしたが、 asakusa.rb の方々がパブリックビューイング会場を用意してくださり、2日目はコミュニティの皆さんと交流しながらイベントに参加することができました。
また Spacial Chat でもたくさんの部屋があり、いろんな人と場所を超えて交流することができて本当に楽しかったです。
2023年はオンライン&オフラインのハイブリット開催が計画されているそうなのでとても楽しみです!
運営の皆さん、発表者の皆さん、参加された皆さん2日間ありがとうございました〜〜〜!