やわらかテック

興味のあること。業務を通して得られた発見。個人的に試してみたことをアウトプットしています🍵

Rails

Rails7.10にて提案した内容がリリースされた

少し前にはなりますが、RailsのDiscussionに問題提起を行いました。 その後、Discussionで「Issueを作成して良いよ〜」とお許しを頂いたのでIssueを作成した所、修正PRが作成されてマージされるという...とんでもない出来事がありました。 www.okb-shelf.wor…

sidekiq.ymlファイルの文字列に環境変数を埋め込む

sidekiq.ymlではERBがサポートされており、環境変数を指定することが可能です。 よく環境変数が使われるのは、並行度(concurrency)の値やタイムアウトの秒数などでしょうか。 :concurrency: <%= ENV.fetch('SIDEKIQ_CONCURRENCY', 10) %> こんな感じでsideki…

ピュアなRubyだけで複数のLoggerに出力する

RubyにはLoggerクラスが組み込みライブラリとして提供されていて、ログをいい感じに出力することができます。 しかし、複数のロガーに対してログを出力することはLoggerクラスだけでは出来ません。RailsであればActiveSupport::Logger.broadcastが使えるそう…

コントローラーの単体テストをファットにしないRspecテストの書き方

Rails製のアプリケーションのコントローラーの単体テストを見ていると内部で使用しているクラスやモジュールの観点・パターンまでを網羅したファットな単体テストが書かれているものを見かけます。しかしながらコントローラーの単体テストはあくまでコントロ…

RailsにIssueを立てたらPRが作成されてマージされた

とんでもないことが起こりました。まじでやばいです。 前回の記事で共有したように「RailsのgithubにIssueとして気軽に立てて良いよ〜」という旨の返信をJean Boussierさんから頂いたので、RailsのIssueを作成してから3日ほど経過しました。 www.okb-shelf.w…

Rails Discussionに投稿したら返信が来てgithubにIssueを作成した

早いもので一年も折り返し...。東海地方もいよいよ梅雨入りしてジメジメした季節になりました。 先日、cache_storeの設定に環境変数を指定してInterger型に変換しないと、キャッシュの書き込み時にエラーが出るという現象を確認しました。この振る舞いに疑問…

Rails Discussionに投稿をしてみた

「今年こそは...今年こそは...OSSに貢献するぞ...!」と思い気づけはや3年。 気持ちだけが先行して何をしたら良いのか分からず。結局、それらしいことは何もしていませんでした。 ですが、先日開催されたRubykaigi2023(コロナになって行けなかったけど)へ参…

PostgreSQLでboolean型のカラムを持つレコードを取得するとt, fとなる

Rubyでpg gemを使って、postgresqlに接続してクエリの実行結果を見ていたところ、boolean型のカラムの戻り値がTRUEの場合にt、FALSEの場合にfとなる現象を確認しました。 CREATE TABLE test1 (a boolean, b text); INSERT INTO test1 VALUES (TRUE, 'sic est…

Rspec+Railsを使ったconcernの単体テストの書き方

Railsの開発にてmodelやcontrollerの共通処理をconcernとして切り出すことはよくあるパターンです。 modelやcontrollerはクラス(class)として表現するものの、concernはActiveSupport::Concernをextendしたモジュール(module)として定義する必要があります。…

mastdonからServiceクラスの作り方を学ぶ

みなさんはRailsの開発にて、サービスクラス(ServiceObject)を使っているでしょうか。 モデルやコントローラーがファットになるのを防ぐために導入される設計方法で、ドメイン知識におけるサービス(eg: 商品の購入処理)の一連の処理をまとめたクラスを作成す…

トランザクションがあれば安心ではないのでRailsでもロックをかけたい

Railsでトランザクションを扱いたい時はActiveRecordに実装されたtransactionメソッドを呼び出します。 ActiveRecord::Base::transaction do : end 今までRailsでトランザクションのブロックを宣言した時は、他のトランザクションからデータの取得、更新は出…

Railsのマイグレーションファイルでt.stringを使うときはlimitを指定してほしい

Railsではマイグレーションファイルを作成してマイグレートを実行することで、テーブルが作成されます。 非常に便利で手軽にテーブルの定義・作成ができるのですが、マイグレートされた結果、どのような型が選択されるのかが隠蔽化されるという問題があると…

オレオレRspecを自作して覚えるRubyのブロック引数について

Rubyのブロック引数についてご存じでしょうか。 非常に便利な機能で皆さんもよく使っている、正確にはブロック引数に対してブロックを渡していますが、ブロック引数を定義する機会がほとんどない方も多いでしょう。 例: eachの場合 # do以降の処理がブロック…

【ええな〜コード】作って学ぶRailsのenumの仕組みについて

Railsを使っていて何かと便利なのが「enum」です。 他の言語では列挙型(Enumerable)と呼ばれることがありますが、実態としてはActiveRecordに定義されたenumという関数です。modelファイルの中でカラム値のバリエーションを指定することが出来るのが非常に便…

【ActiveRecord】レコード数を取得するにはlengthやcountではなくsizeを使っておけば良さそう

単体テストのコードを見ていて、対象のテーブルに存在するレコード数を取得する際の記述が統一されていないことを発見しました。ある箇所ではUser.all.sizeと記述されており、ある箇所ではUser.countと記述されており、どの方法で取得するのが効率が良いのか…

idの絞り込みにfindを使わずfind_by!を使っていたのはなぜなのか

コードレビューをしていていた日のこと。あるテーブル(users)からidで絞り込んでレコードを1件取得する際に、以下のようなコードが頻出していることに気づきました。 User.find_by!(id: params[:user_id]) 処理の内容としては、idカラムでusersテーブルから…