Madogiwa Blog

主に技術系の学習メモに使っていきます。

Ruby

ActiveRecord::QueryMethods#whereで発行されるwhereの部分だけのSQLを取得するMEMO

はじめに 下記のような形でActiveRecordが発行するSQLからWHERE句の部分のSQLだけを取得したいケースがあり、色々やり方とか調べたのでMEMO✍ はじめに やりたかったこと where部分だけのSQLを取得する方法 参考 やりたかったこと 今回やりたかったのは、下記…

E2EテストでJavaScript上の時間を固定するgem `travel_to_javascript`を作りました💎✨

JavaScriptの処理で時間に依存してたりする実装を行っているとE2Eのときに時間を固定したいときが稀によくあるのですが、 travel_toを使っても結局はサーバーサイド上の時刻しか固定出来ません というわけでJavaScript上の時刻を固定するtravel_to_javascrip…

`ActiveRecord::Relation#explain`を拡張してJSON形式のEXPLAIN結果を取得出来るgemを作った💎

前に下記の記事で紹介したActiveRecord::Relation#explainでJSON形式を取得出来るモンキーパッチを紹介したのですが、 今回はそれをGemとして公開したのでそれについて書きます✨ madogiwa0124.hatenablog.com Gemはactive_record_json_explainとしてRubyGems…

ActiveRecordにモンキーパッチを当ててJSON形式のEXPLAINを取得出来るようにする🐵

ActiveRecord::Relation#explainを使うと、実行するSQLのEXPLAINの結果を取得出来ます。ActiveRecord::Relation#explainではデフォルト設定でしか結果を取得出来なのですが、EXPLAINにはオプションが設定できます。 特にMySQLではオプティマイザが評価したSQ…

RubyonRails: ActiveJobのperform_laterが実行されてadapterがenqueueするまでの挙動を追ってみた。

最近Sidekiqを扱うことが割とあり、ActiveJob経由で使ったときの挙動をいまいち把握出来てなかったのでコードを読んでみて、内容とかをざっくりメモしておきます ちなみに読んだのはrailsの6-stableブランチのコードです。 rails/activejob at 6-0-stable · …

RailsでIDの可逆難読化する方法のメモ📝

最近、IDの可逆な方式で難読化したいけどfriendly_idみたいなmigrationが伴うものは、ちょっと避けたかったので色々と方法を考えたり人に教えてもらったりしたので、いろいろ方法とかをメモしておきます。 github.com やりたいこと ActiveRecordでUUIDを使う…

自作フレームワークで動的URLに対応したときの方針とか考えたこと📝

github.com /hoge/1/fuga/2にGETでアクセスしたときに下記のロジックを実行させたいときにどうするかちょっと悩んだので考えたこととかメモしておく。 router.get '/hoge/:hoge_id/fuga/:fuga_id' do request.params['id'] end 今までは完全一致でパスの検証…

Rubyのmethod_missingの使い方MEMO🔯

最近Rubyのメタプロ本を再読して、method_missingを使った実装を試してみたので使い方とかメモしておきます method_missingとは? method_missingを使ってみる method_missingを使ってもrespond_to?をtrueにしたい おわりに method_missingとは? 呼びだされ…

オレオレWebフレームワークのv0.1.2をリリースしました🥳

オレオレWebフレームワークのv0.1.2をリリースしました github.com 今回のアップデートで、unicornやpumaといったRack::Handlerに対応したアプリケーションサーバーであれば好きなものを使えるようになりました 変更方法は簡単でGemfileにアプリケーションサ…

CommitteeでOpenAPIによるAPI定義ドキュメントをもとにリクエスト/レスポンス形式をチェックする

最近、Nuxt.jsとRailsでSPAのアプリケーションを作っていて、schema管理をOpenAPIで行ってみているのですが、 せっかくなのでCommitteeを使ってCIで検証するようしてみたので導入方法とかをメモしておきます Committeeとは? Committeeの使い方 Committeeを…

rails 6の新機能`insert_all`を試してみたのでMEMO📝

railsでbulk insertするときには今まではactiverecord-importが使うことが多かったと思いますが、 rails 6からはActiveRecord::Persistence#insert_allが追加されたので標準機能を使ってbulk insertを行うことができるようになりました。 github.com 実際に…

あなたの知ってるRubyGemsTipsというイベントでGemの依存関係まわりの話でLTしました💎

先日下記のイベントでLT登壇してきました。 (LTでイベント登壇するのは初めてだったので実績解除した) connpass.com 資料はこちら speakerdeck.com 内容は、bundle gemでGemを作ったときに依存するgemをGemfileとgemspecどっちに書くか的な話でした。 最終的…

Ruby: lamdaを使っていい感じにロジックを変数に入れてスッキリ書く

みなさんRubyのlamdaを使っていますか?lamdaを使うとロジックを変数にいれて抽出するようなことが出来ます。これを使うと複雑なロジックを変数に入れて名前をつけられたり、いろいろとスッキリかけるケースが多そうな気がしてきたのメモしておきます lamda…

DockerでNuxt.jsとRailsの環境を作った

昨今、フロントとバックエンドを別々のリポジトリにしてOpenApiでインターフェースを定義して進むプロジェクトが増えてきていると感じていますが、OpenApiとか全然付いていけてないので個人でNuxt.jsとRuby on Railsが別々のコンテナで立ち上がる環境を作っ…

Ruby: gem istallを実行してからgemがinstallされるまでの実装の流れを途中まで追ってみた

普段自分が何気なく実行しているgem installが実際にどのように行われれているのか気になったのでコードを読んで流れを追ってみました ※今回読んだのはrubygemsのstableなブランチを思われる3.0のコードです。 GitHub - rubygems/rubygems at 3.0 gem instal…

Railsで確認画面を挟んで登録する場合どう実装するのがよさそうか考えてみた

はじめに Railsで確認画面を実装すると毎回、ベストプラクティス的な解決方法が見つからず悩むので、どういう実装をするのが良いのか少し感がてみました。(私の個人的な見解です‍♂️) はじめに 確認画面の難しさ よく見るやり方 その他のやり方を検討してみる…

Rspec、Capybaraを使ったfeature specでJavaScript側でも指定した時間で固定できるHelperを作った

今回はタイトルどおり、Rspec、Capybaraを使ったfeature specでJavaScript側の時間を操作するhelperを作ってみたので考慮漏れとかあるかもですが書きます。 ↓コードだけみたい人はこちら rspecを使ったfeature specでjavascriptの時間を指定時間に固定するhe…

自作RubyGemで実行コマンドを作る方法

最近自作フレームワークにrails newのようなコマンドを追加したくてRubyGemで実行コマンドを作る方法について調べたのでメモしておきます github.com 実行コマンドとは? 実行コマンドというのはrails newやrspecといったRubyのコード外からgemのコードを呼…

Rubyで学オブジェクト指向 SOLID原則「依存性逆転の原則(Dependency inversion principle)」

Clean Architecture 達人に学ぶソフトウェアの構造と設計を読んで、オブジェクト指向の原則について学びがあったので、Rubyのコード例と共に内容を整理してみました。 Clean Architecture 達人に学ぶソフトウェアの構造と設計作者: Robert C.Martin,角征典,…

Rubyで学オブジェクト指向 SOLID原則「インターフェイス分離の原則(Interface segregation principle)」

Clean Architecture 達人に学ぶソフトウェアの構造と設計を読んで、オブジェクト指向の原則について学びがあったので、Rubyのコード例と共に内容を整理してみました。 Clean Architecture 達人に学ぶソフトウェアの構造と設計作者: Robert C.Martin,角征典,…

Rubyで学オブジェクト指向 SOLID原則「リスコフの置換原則(Liskov substitution principle)」

Clean Architecture 達人に学ぶソフトウェアの構造と設計を読んで、オブジェクト指向の原則について学びがあったので、Rubyのコード例と共に内容を整理してみました。 Clean Architecture 達人に学ぶソフトウェアの構造と設計作者: Robert C.Martin,角征典,…

Rubyで学オブジェクト指向 SOLID原則「開放閉鎖の原則(Open–closed principle)」

Clean Architecture 達人に学ぶソフトウェアの構造と設計を読んで、オブジェクト指向の原則について学びがあったので、Rubyのコード例と共に内容を整理してみました。 Clean Architecture 達人に学ぶソフトウェアの構造と設計作者: Robert C.Martin,角征典,…

Rubyで学オブジェクト指向 SOLID原則「単一責任の原則(Single responsibility principle)」

Clean Architecture 達人に学ぶソフトウェアの構造と設計を読んで、オブジェクト指向の原則について学びがあったので、Rubyのコード例と共に内容を整理してみました。 Clean Architecture 達人に学ぶソフトウェアの構造と設計作者: Robert C.Martin,角征典,…

MakanaiというRubyで作ったオレオレWebフレームワークをリリースしました💎✨

WEBrickとSqlite3で動作するシンプルなWebアプリケーションが作れる、MakanaiというフレームワークRubyで作りました‍ github.com なぜ作ったか? RailsやSinatraといったRuby製の素晴らしいWebアプリケーションフレームワークが世の中にあるなか、なぜMakana…

Rubyで作るオレオレWebフレームワーク「第4回 Viewのレンダリング機能を作る🌌」

RubyでオレオレWebフレームワークを作っているのですが、だいぶ形になってきたので知識の整理がてら色々まとめてみる✍ 今回は第4回目です 第3回 クエリ文字列を含んだGETに対応したRouting機能作るはこちら madogiwa0124.hatenablog.com 今回のゴール 処理の…

Rackアプリケーションのテストでリクエストをモックする方法

オレオレフレームワークを作っていると自作のRackアプリケーションのテストを書くときに、 「どうやってリクエストをモックすればいいか」という問題が立ちふさがるのですが、 Rackの標準ライブラリを使うといい感じに出来ることがわかったのでMEMO✍ そもそ…

Ruby on Rails: includesがどうやってpreloadとeager_loadを使い分けてるか調べてみた。

N+1を解消する方法としてincludesを使うことが多いと思います。includesを使うrailsがよしなにpreloadとeager_loadを使い分けてくれますが、その使い分けの条件を知らずに、とりあえずincludesを使ってしまうと思いも寄らないSQLが実行されてしまう恐れがあ…

Rubyで作るオレオレWebフレームワーク「第3回 クエリ文字列を含んだGETに対応したRouting機能作る🛣」

RubyでオレオレWebフレームワークを作っているのですが、だいぶ形になってきたので知識の整理がてら色々まとめてみる✍ 今回は第3回目です 第2回 GETに対応したRouting機能を作るはこちら https://madogiwa0124.hatenablog.com/entry/2019/09/01/233842 今回…

Rubyで作るオレオレWebフレームワーク「第2回 GETに対応したRouting機能を作る🛣」

RubyでオレオレWebフレームワークを作っているのですが、だいぶ形になってきたので知識の整理がてら色々まとめてみる✍ 今回は第二回目です✌️ 第1回 Hello World はこちら https://madogiwa0124.hatenablog.com/entry/2019/08/25/181608 今回のゴール まずはR…

Rubyで作るオレオレWebフレームワーク「第1回 Hello World 🌏」

RubyでオレオレWebフレームワークを作っているのですが、だいぶ形になってきたので知識の整理がてら色々まとめてみる✍ 今回のゴール Rackを使ってWEBrickとコードを繋ぐ WEBrickとRackを使ってレスポンスを返す おわりに 参考 今回のゴール 最終的には、CRU…