今日は開発中に見つけたruby/railsのマイナーだけど便利?なメソッドを紹介しようと思います。
開発中に「これ聞いたことないなー、どこで定義されてるんだろう」と思ってプロジェクト内を調べるもどこにも定義されていなかったものたちやなんかの技術ブログでたまたま見つけたものたちです。
deep_symbolize_keys
ハッシュのkeyを階層を問わず、全てをシンボルに変えてくれるメソッドです
[1] pry(main)> { 'hoge' => 1, 'fuga' => 2, 'foo' => { 'bar' => 3 } }.deep_symbolize_keys
# => {:hoge=>1, :fuga=>2, :foo=>{:bar=>3}}
カラム名__before_type_cast
enumがかかる前の値を出してくれます
[1] pry(main)> User.find(1).status
# => "active"
[2] pry(main)>User.find(1).status_before_type_cast
# => 1
read_attribute_before_type_cast(:status)
これでもできるようです
[1] pry(main)> User.find(1).read_attribute_before_type_cast(:status)
# => 1
rails consoleなどで値がたくさんあるenumの確認に使えそうですね
class Pikmin < ApplicationRecord
enum type: {
red: 0,
blue: 1,
yellow: 2,
white: 3,
purple: 4,
}
[1] pry(main)> Pikmin.find(1).type
=> "yellow"
# 黄色ピクミンって何番目だっけ...
[1] pry(main)> Pikmin.find(1).type_before_type_cast
=> 2
all_year all_quarter all_month ...
[1] pry(main)> Date.today.beginning_of_month..Date.today.end_of_month
# => Sat, 01 Dec 2018..Mon, 31 Dec 2018
これを簡単に書けます
[1] pry(main)> Date.today.all_month
#=> Sat, 01 Dec 2018..Mon, 31 Dec 2018
同じ要領で年や四半期、一週間や一日なども簡単に書けます
[1] pry(main)> Date.today.beginning_of_year..Date.today.end_of_year
#=> Mon, 01 Jan 2018..Mon, 31 Dec 2018
[1] pry(main)> Date.today.all_year
#=> Mon, 01 Jan 2018..Mon, 31 Dec 2018
all_year
で書いた方が可読性が上がると思います。
例)
[1] pry(main)> date = Date.today
[2] pry(main)> User.where(created_at: date.beginning_of_quarter..date.end_of_quarter)
#=> Mon, 01 Oct 2018..Mon, 31 Dec 2018
[3] pry(main)> User.where(created_at: date.all_quarter)
#=> Mon, 01 Oct 2018..Mon, 31 Dec 2018
in_milliseconds
時間をミリセカンドに直してくれます
[1] pry(main)> 1.minutes.in_milliseconds
# => 60000
[2] pry(main)> 1.hour.in_milliseconds
# => 3600000
1000倍してるだけです
[1] pry(main)> 810.in_milliseconds
# => 810000
今は「これどこで使うんだろう...」と思っても知っていたら便利かもしれません。
見ていただいた方の知らなかったメソッドがあれば嬉しいです。