9
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

LinkbalAdvent Calendar 2018

Day 20

rubyであまり使わないけど知ってたらかっこいいメソッド

Last updated at Posted at 2018-12-19

今日は開発中に見つけた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

今は「これどこで使うんだろう...」と思っても知っていたら便利かもしれません。
見ていただいた方の知らなかったメソッドがあれば嬉しいです。

9
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?