Ruby on RailsのActiveSupportに便利メソッドがいっぱいあるとは聞いていたが、調べてみたら「こんなのがあるのか!」と目から鱗だったので紹介。
1. all_day, all_week, all_month, all_year
今までPostモデルに
scope :created_this_month -> do
where(created_at: Time.zone.today.beginning_of_month..Time.zone.today.end_of_month)
end
としていうようなスコープを生やしていたが、whereの部分は
where(created_at: Time.zone.today.all_month)
でいけた。スコープを生やすまでのこともなかった。
2. to_query
www.mywebservice.com?name=aaa&age=20&group=foo
上のようなURL末尾のクエリ文字列を作る時に?以降を整形するのが結構大変。
そんな時は、 to_query
を使うと
hash = { name: 'aaa', age: 20, group: 'foo' }
hash.to_query # => "age=20&group=foo&name=aaa"
となって便利。アルファベット順に並べてくれるらしい。
3. squish
word前後のホワイトスペースが一つだけになるように整形してくれる。
" \n foo\n\r \t bar \n".squish # => "foo bar"
4. inquiry
StringオブジェクトをStringInquirerオブジェクトに変換して、stringの文字列内容をメソッドチェーンで判定できる。
'production'.inquiry.production? # => true
'production'.inquiry.test? # => false
5. starts_with, ends_with
4.に似ているが、文字列の一文字目と最後の文字を判定。
RubyにString#start_with, String#end_withが定義されているが、そのエイリアス(三単現のsつき)。
( @znz さん、ご指摘ありがとうございます!)
"foo".starts_with?("f") # => true
"foo".ends_with?("o") # => true
6. pluralize
英単語の複数形を返す。
"car".pluralize # => "cars"
"person".pluralize # => "people"
じゃあこれは?
"日本人".pluralize
# => "日本人s"
文字列の扱いは本当に色々なメソッドが用意されていて、これに似たメソッドで、
singularize, camelize, underscore, titleize, parametize, tablize, ...などがある。
7. to_s (Numericクラス)
文字列にしてくれるだけ、と言っても
34.to_s # => "34"
だけではなく、様々なオプションがある。以下は一例。
1231112222.to_s(:phone) # => 123-111-2222
1234567890.50.to_s(:currency) # => $1,234,567,890.50
123456789.to_s(:delimited) # => 123,456,789
1234567.to_s(:human) # => "1.23 Million"
なお、0から始まるFixnumは8進数と解釈されるので、 to_s(:phone)
を日本でよく使われている0から始まる電話番号に使おうとすると
0454444444.to_s(:phone) # => "7-879-2996"
0458888888.to_s(:phone) # => SyntaxError: Invalid octal digit
となってしまうので、残念ながら日本の電話番号で使うのは難しい模様。
8. ordinalize
数字を序数に、つまり 1
から 1st
みたいにしてくれる。
1.ordinalize # => "1st"
2.ordinalize # => "2nd"
53.ordinalize # => "53rd"
2017.ordinalize # => "2017th"
9. many?
collection.size > 1 かどうかを判定してくれる。
Program.where(id: 1).many? # => false
10. to_sentence
文字列からなる配列の中身を結合して、英語っぽく整形してくれる。
%w(Earth Wind Fire).to_sentence # => "Earth, Wind, and Fire"
11. to_s (Rangeクラス)
範囲オブジェクトの中身を文字列でうまいこと整形してくれる。dbオプションは結構使えそう。
# 2017年9月30日(土)の場合
(Date.today..Date.tomorrow).to_s # => "2017-09-30..2017-10-01"
(Date.today..Date.tomorrow).to_s(:db) # => "BETWEEN '2017-09-30' AND '2017-10-01'"
12. on_weekday? on_weekend?
Date, Time, DateTimeオブジェクト周りのメソッドは使えるメソッドの目白押しですが、Rails5で導入されたon_weekday?は結構使えそう。(月~金かどうかを判定)
# 2017年9月30日(土)の場合
Time.zone.today # => Sat, 30 Sep 2017
Time.zone.today.on_weekday? # => false
Time.zone.today.on_weekend? # => true
参考: http://guides.rubyonrails.org/v5.0/active_support_core_extensions.html