Ruby
Rails
tips
activesupport

今日から役立つ!? ActiveSupportの便利・おもしろ記法12選

More than 1 year has passed since last update.

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