LoginSignup
29
25

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-09-30

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

29
25
3

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
29
25