カクカクしかじか

技術的なアレコレ

Ruby

Rubyでメソッドの定義位置を特定する方法

経緯 とある修正の影響範囲調査で色々やっていたときの備忘録です。 やり方 たとえばこんな感じ‍♀️ Method#source_location を使います Faker::Name.method(:name).source_location => ["/Users/fuqda/HogeApp/vendor/bundle/ruby/2.6.5/gems/faker-2.13.0/l…

特定のクラスを継承したファイルの一覧をRubyのスクリプトから出す方法

掲題のやりたいことを実現するスクリプト ※descendantsメソッドはActiveSupportのメソッド descendantsメソッドは、そのレシーバより下位にあるすべてのクラスを返します。 Active Support コア拡張機能 - Railsガイド # Load Dir.glob('app/mailers/**/*.rb…

Rubyで知らなかった記法の話

はじめに えっ..こんな書き方あったのか...となる機会があったので忘れないように書き記しておきます! (高度な内容はたぶんないですw) 検証バージョン 2.6.5 複数の配列を一意の値で結合した配列に変換する 書き方 配列 | 配列2 | 配列3 コンソールでの実行…

Rubyで半角カナを1文字、全角カナを2文字でカウントする方法

概要 全角カナなら2文字・半角カナなら1文字でカウントしてデータを扱いたいケースがあったのでその調査メモ 単純に文字列に対して '文字列'.size をしても全角半角で区別出来ないので、バイトサイズでカウントしてみることにしました。 (半角カナ:1文字1バ…

Railsアプリ上で文字列をクラス定数に変換する方法

経緯 異なるクラスであるものの、同じ形式のクラスメソッド呼び出しを共通化したいというケースに直面し、調べることに! # やりたいこと 特定のクラス名.クラスメソッド やり方 小文字の文字列をクラス名の形式にするために classify しても、その結果はま…

RailsでActiveRecord::Enumを使わずにそれっぽい機能を実装する方法

経緯 普段の業務でmongoidというActiveRecordとは異なるORM(正確にはODM)を使っています。 当たり前ですが、ActiveRecordを使用しないRailsアプリではActiveRecordの使用を前提としたRailsの機能を使用することが出来ません。 というわけで、ActiveRecord::E…

mongoidのupdate_allにバグがあるかもしれない?

gemのバージョン mongoid 6.1.1 MongoDBのバージョン Docker使用 mongo:3.6.12 概要 一対多のモデルに対する update_all が正しく動いてなさそう... 雑な例 (実際のコードとは関係ありません) Orderモデルにpending(入金待ち)、complete(決済完了)とcancel(…

brew updateの影響でreadlineに依存してるgemとtigが壊れた場合の解決法

発生エラー brewで最新のmondodbをインストールするために brew update を行った後 rails console を実行したら今回のエラーが発生しました。 $ bundle exec rails c /Users/shigeyukifukuda/.rbenv/versions/2.3.8/lib/ruby/2.3.0/irb/completion.rb:10:in …

Railsのbinding.pryじゃない!Rubyのデバッガーを使う方法

Rubyのデバッガーを使う -r debug をつけてRubyのファイルを実行するとデバッグモードでファイルを起動することが可能です!!(知らなかった...) $ ruby -r debug 実行ファイル デバッグのやり方 Railsのbinding.pry同様にnext(次へ)やstep(メソッド呼び出しが…

Rubyの関数的メソッドについて

はじめに たまに関数型プログラミング言語の話題になるのですが、そもそもどういったものが関数的であるかについて自分自身理解していませんでした。 ここでは、Rubyの中で「関数的」と言われるメソッドの実行内容を見てみることでプログラミング言語の界隈…

Rubyにおける例外の握りつぶし手法

はじめに どうしてもしょうがない時に使う例外の握りつぶし方についてメモ。 例外の握りつぶしとは? 本来エラーで処理が落ちるところを例外をなかったかのように処理を続行させること。 ちなみに当たり前ですが、例外を握りつぶすことで本来の例外が発生し…