1. tanaken on Rails
  2. #024: start_transaction, in_..
2024-06-16 19:53

#024: start_transaction, in_order_of, rails notes

00:00
はい、こんにちは。第24回のtanaken on Railsです。今週は、This Week in Railsから、3つのプレリクエストをピックアップします。
1つ目、define the new startTransaction.activeRecord eventということで、アクティブレコードに関する変更です。
まず、前提として、Active Support Instrumentationというものについて説明したいと思います。
こちらは、日本語版のRailsガイドにまとまっているものがあるので、そちらから引用しながら説明したいと思います。
アクティブサポートに含まれているインストルメンテーションAPIは、Rubyコードで発生する特定の動作の計測に利用できます。
Railsアプリケーション内部や、フレームワーク自身の計測はもちろん、必要であれば、Rails以外のRubyスクリプトなども計測できます。
アクティブサポートが提供するインストルメンテーションAPIを使って、フックを開発すると、他の開発者がそこにフックできるようになります。
Railsフレームワーク内部には様々なフックが用意されています。
例えば、アクティブレコードには、データベースへのSQLクエリが発行されるたびに呼び出されるフックが用意されています。
このフックをサブスクライブ括弧、高読括弧とすると、特定のアクションでのクエリ実行数を追跡できます。
といった記載があります。
インストルメンテーションAPIは、計測のために使うものだよと。
フックが開発してあって、Railsの中に様々なフックが用意されていて、
例えば、アクティブレコードでは、クエリが発行されるために呼び出されるフックもあるよと。
それを高読できるよと。
フックをサブスクライブする方法についても記載がされています。
今、アクティブレコードの例で話していたのですが、Railsガイドのほうでは、また違うイベント棚について書かれています。
また引用を読みますね。
イベントは簡単にサブスクライブできます。
active-support://notifications.subscribeメソッドをブロック付きで記述すれば、すべての通知をリスンできます。
サンプルコードとして、active-record://notifications.subscribe引数に、process-action.action-controllerの文字列で、process-action.action-controllerというのを書いて、
03:15
ブロックを渡しています。
ブロックが、do、イベントというブロックの引数で、
ブロックの内部は、event.name、event.duration、event.payloadと書いていて、
それぞれイベントの名前とか、イベントの時間の期間ですね。
イベントのスタートからイベントのエンドまでの秒数、ミリセカンド、ミリ秒数ですね。
イベントごとに異なるペイロードを受け取ることができて、そのペイロードもイベントオブジェクトで呼び出せると。
で、rails.logger.info、event-received、イベントネーム、イベント名がレシーブされたよというようなログを出したりとかっていうのをやっているっていうブロックですね。
そんなブロックを渡しています。
この例で出した、process-action.action-controllerというイベントは、
名前の通りですね、process-actionって言ってるんで、
コントローラーの特定のアクションが来たときに、そのアクションを処理したときのイベントです。
ペイロードにはコントローラー名、アクション名はもちろん、
リクエストのヘッダー、リクエストパラメーター、
あとはレスポンスですね、レスポンスのhttpステータスコードだったり、
レスポンスオブジェクトだったり、
あとはレスポンスにあたって、コントローラーでビューで表示するのにかかった時間というのと、
データベースのクエリ実行にかかった時間などの情報もペイロードに含まれています。
詳しくはレールズガイドに様々なフック、レールズフレームワーク内のフックについての記載があるので、
そちら、今回のプロセスアクション、アクションコントローラーについてももちろんありますし、
その他もたくさんあるので参照してくださいというところですね。
というのが、アクティブサポートインストルメンテーションについての説明でございました。
今回のプレリクエストでは何をやっているのかというと、
インストルメンテーションAPIを使って新しいイベントのフックが実装されています。
具体的には、スタートアンダスコアトランザクション.アクティブアンダスコアレコード、
スタートトランザクション.アクティブレコードというイベントですね。
06:07
このイベントは名前の通りですが、
アクティブレコードのトランザクションが開始されたときに呼び出されるというイベントフックですね。
類似するイベントとしては、トランザクション.アクティブレコードというものがすでにあります。
これはトランザクションが終了したときに呼び出されるものでした。
なので、トランザクションの開始イベントを講読する手段がなかったですね。
今回のプレリクエストでは、開始イベントを講読できるようになるよということで、
これにてトランザクションの開始と終了を両方とも講読できるような状態になって、
嬉しいねという感じですね。
今回のプレリクエストで追加されたスタートトランザクションアクティブレコードというイベントについては、
レールガイドのエッジガイドのほうにはすでに記載が追加されているので、
そちらを参照してくださいというところですね。
ざっと見ると、ペイロードはトランザクションオブジェクトとコネクションオブジェクトの2つだけですね。
トランザクションオブジェクトを見て、
トランザクションの状態とかが判断できたりとかいう感じなのかなと思います。
というところで1つ目のプレリクエストの紹介でした。
残り2つそれぞれ紹介していきますね。
2つ目、アクティブレコードアドオプションフィルターオンインオーダーオブというプレリクエストです。
こちらはアクティブレコードに関する変更です。
そもそもアクティブレコードコロンコロンクエリーメソッドにインオーダーオブというメソッドがあります。
このインオーダーオブメソッドというのは、第1引数にカラムのシンボルを渡し、第2引数に配列を渡しています。
第1引数に渡されたカラムを第2引数の配列に指定した値でフィルターした上で、その配列の値の順番で並び替えるというメソッドです。
具体例を見てみますね。
ユーザー.インオーダーオブ括弧第1引数がID、第2引数が153という配列だとしましょう。
そうすると発行されるクエリがセレクトユーザーズ、フロムユーザーズ。
フェアユーザーズIDイン153で渡したので、まずフィルターされているとIDでフェアークでフィルターされている。
09:03
その次にオーダーバイケース分が渡されていますね。
オーダーバイにケースでフェアユーザーズID1だったら1、フェアユーザーズIDイコール5、ゼン2。
オーダーバイケースフェアユーザーズIDイコール1、ゼン1。
フェアユーザーズIDイコール5、ゼン2。
フェアユーザーズIDイコール3、ゼン3。
ユーザーズのIDが1なら1番目、5なら2番目、3なら3番目というふうにケース分を使ってオーダーバイにケースを渡して並び替えをしているということですね。
つまりもう一度言うとユーザーをID1、5、3でフィルターした上で1、5、3の順番になるようにそうとしていると。
そういうメソッドがinorderofというメソッドですね。
今の例ではIDというカラムについてでしたけど、
ただ今回のプレリクエストの変更でどんなことがあるかというとオプショナルな引数としてフィルターというキーワード引数が追加されています。
このキーワード引数はどういう動作を変えるのかというと、第2引数の配列で指定された値、こいつらで今までは必ずフィルターをしていたんですけど、
フィルターするかどうかを定義してこの値を設定するということになります。
実際に引数の配列で指定された値 こいつらで今までは必ずフィルター
を押してたんですけど フィルター するかどうかをフィルターという
キーワード引数 ブリアンの値で 分岐するという引数です
デフォルトの値はtrue 必ずデフォルト の値はtrueなんで何も指定しない
場合は必ずフィルターするよということ ですね
先ほどの例をフィルターという キーワードをfalseで指定した場合
どんなふうになるのかというの を見てみましょう
user.inorderofid,配列の1,5,3,filter false こうなると発行されるクエリ
これがselectusersfromusersorderbycase whenusersid="1", then 1, whenusersid="5",
12:02
then 2, whenusersid="3", then 3, else 4, end という感じで まずフィルター
がなくなっている フィルター false なのでフェアワークがなくなって
いますね fairusersid="1,5,3", usersidin="1,5,3",でフィルターしてた部分
がなくなっています もう1個の 変更点としてはorderbyのケース
の一番最後にelseが追加されてて else4という形になっています なので
これはつまりどういうことかという とフィルターしてないのでidが
1,5,3以外のユーザーのレコード も取ってきますと ただidが1,5,3
じゃないユーザーのデータについて はorderbyで評価する値としては
4 四番目だよ つまり1,5,3っていう のが一番目 二番目 三番目という
順番に並んで それ以外の例えば 4とか2とかid4とか2とか6 7 8とか
っていうやつは全部同じ順番という かどっちが前にいるとかは関係ない
よと どういう順番でもいいよという 感じになるという並び方になる
よということですね っていうフィルター オプションが追加されたということ
ですね オプショナルなフィルター というキーワード引数が追加されて
いますということでございます ね ありますよね 優先的に並べたい
もの値があって それ以外のものも 後続でつい何だろうな それ以外
のものも並べたいと 例えば僕が 経験したものであると商品のリスト
がありますと そのうちで自分の ショップがあって 自分の商品の
リストがあって その中でお気に入り のものとか必ずショップの先頭
に表示したいものみたいなもの がありますと その子たちは商品
リストの上のほうに来てほしい と ただ その子たちだけを出したいん
じゃなくて 続く情報としてお気に入り に登録していない商品も並べて
おきたいというのがありました ね そういう場合はこのinorderofで
お気に入りトゥルーのものだけ 最初に出して お気に入りじゃない
ものはそのままの順番で出すみたいな ことができるといいのかななんて
15:00
思いましたね 続いて最後三つ目です 三つ目
はadd an internal route for binrailsnotes というプリリクエストです こちら
はレールタイズに関する変更です binrailsnotesっていうコマンドがある
のは皆さんご存知でしょうか 実は 僕 知らなかったんですけど railsnotes
というコマンドがあります これは Railsガイドにもちゃんと記載
がありますね リンクを貼ってあります Railsnotesはどんなコマンドかという
と ソースコードの中でto doとか fix meとかっていうキーワードで記載
されているところをリストアップ してくれるというコマンドです
よくありますよね to do 後でやる これ 後で○○するとか あとは
fix me これは一旦こうしてるけど 本当はこういうふうに直したい
とかって でも時間の問題で 今は 先にリリースしたいので コメント
だけ残しておくとかっていうの があるかと思います そういった
特定のキーワードで始まるコメント をピックアップして一覧で表示
してくれるというのがrailsnotes というコマンドです
ファイルリクエストに記載された コマンドの実行例を見ると bin
sla Railsnotes 実行すると 例えば ファイル名が出てますね app slacontrollers
sla postcontroller.rb その中にコメント が二つあって 一つ目は 休業目
にto doってコメントがあるよと move this logic to a concern このロジック
がコンサーに移すよっていうto do コメントがあったり 続いて18行目
fix me refactor this method このメソッド をリファクターリファクタリング
するぞとかっていうのが書いて あると つまり ファイルごとに
行数とそのコメントの内容が表示 されるようになっているという
感じですね 今回のプレディクエスト では何をやってるかというと この
bin sla Railsnotes でコマンドライン で表示されるような結果をブラウザ
上でも確認できるようにしたい ぞという思いでプレディクエスト
が作られています 具体的には起動 しているRailsアプリケーション
のsla Rails slainfo slanotesでノーツ の内容が表示されるようにする
18:00
ということですね 実際の画面 こんなふうになりますというスクリーンショット
がリクエストに載っていたので それをショーンドットにも貼って
います 分かりやすくファイル名 と行数 行ナンバーとどんなコメント
タグ to doなのか fix meなのかという のと その内容 コメントの内容
っていうのが一覧で出るようになっている という感じですね
インフォルーツとかルートのルーティング を確認するとか その辺の機能
はよく目にする 使ったりも僕は してましたけど そもそもRailsnotes
というコマンドがあるの知らなかった し これが画面で確認できるのは
便利 便利っちょ便利なのかっていう 感じですね 自分の場合は結構エディター
のほうでto doとかfix meとかって なっているコメントを拾えるよう
になっているんで どうだろうな コマンドで確認したいという気持ち
もなかったし ブラウザで確認したい という気持ちも実はなかったっちゃ
なかったんですけど こういうコマンド でしか見れないものをRailsのこの
Railsインフォ Railsスラインフォスラ のところで見れるようにするという
のは そういうプレリクエストも あるんだなというのを学びになりました
ね そんなところです 今週はプレリクエスト
を三つ紹介しました ちょっと思った より長くなっちゃいましたが こんな
ところで終わりにしたいと思います では また来週バイバイ
19:53

コメント

スクロール