学んだことをなぐり書き


概要

組み込みクラスなどを拡張して使いやすい形に拡張してくれている。
rails以外でも以下のrequireを追加すれば使える。

require 'rubygems'
require 'active_support'

year(s), month(s), week(s), day(s), hour(s), minute(s), second(s) - 時間を取得する

組み込みクラスのInteger, Floatを拡張してより自然な形で数値の演算ができる。
複数形でも単数形でも両方同じように使える

p 2.year  + 5.month  + 10.week  + 3.day  + 1.hour  + 30.minute  + 10.second
p 2.years + 5.months + 10.weeks + 3.days + 1.hours + 30.minutes + 10.seconds

index_by - コレクションのある属性をキーにしたハッシュを作成

group_by との違いはindex_byは値が一つだけでgroup_byは値が配列になっている。
# コレクションをハッシュに分類する。
# ハッシュのキーはブロック内の返り値
p (0..10).index_by { |i| (97 + i).chr }

Person = Struct.new(:name)
p %w|taro jiro saburo|.map { |name|
  Person.new(name)

# group_by と同じように &:属性の形で省略できる
}.index_by(&:name)
{"k"=>10, "a"=>0, "b"=>1, "c"=>2, "d"=>3, "e"=>4, "f"=>5, "g"=>6, "h"=>7, "i"=>8, "j"=>9}
{"taro"=>#<struct Person name="taro">, "jiro"=>#<struct Person name="jiro">, "saburo"=>#<struct Person name="saburo">}

each_with_object - 引数のオブジェクトを追加して each して最後にそのオブジェクトを返す

# 引数の中のオブジェクトをブロックの2番目の引数に入れて
# ブロックの処理が終われば引数のオブジェクトを返す処理
p (0..10).each_with_object({}) { |i, hash|
  hash[i] = i
}
{5=>5, 0=>0, 6=>6, 1=>1, 7=>7, 2=>2, 8=>8, 3=>3, 9=>9, 4=>4, 10=>10}
ソースを直接見たほうが早いという説もある
def each_with_object(memo, &block)
  memo.tap do |m|
    each do |element|
      block.call(element, m)
    end
  end
end
tapについてこちらを参照?

with_options - 同じオプションを何度も使うときに使用する。

class Test
  # 引数の最後がハッシュを受け取るメソッドならどれにでも使える
  def say str, options = {}
    puts "====================="
    puts str
    options.each { |k, v|
      puts k.to_s + ": " + v.to_s
    }
    puts "====================="
  end
end

t = Test.new
t.say("index", :controller => "admin", :action => "index")
t.say("show",  :controller => "admin", :action => "show")

t.with_options(:controller => "admin") { |admin_map|
  # 薄いラッパーのような形になるので、ブロック引数は呼び出したオブジェクトとして扱える。
  admin_map.say "new",  :action => "new"
  admin_map.say "edit", :action => "edit"
}
=====================
index
action: index
controller: admin
=====================
=====================
show
action: show
controller: admin
=====================
=====================
new
action: new
controller: admin
=====================
=====================
edit
action: edit
controller: admin
=====================

その他よく使うメソッド一覧

http://doruby.kbmj.com/yoppi_on_rails/20080226/Rai...
メソッド名説明拡張元
blank?空文字列やnilなどをまとめてチェックするObject
many?コレクションのサイズが一つ以上かどうかEnumerable
to_jsonjson形式に変換するObject
to_yamlyaml形式に変換するObject
stringify_keysハッシュのキーをシンボルから文字列に変えるHash
symbolize_keysハッシュのキーを文字列からシンボルに変えるHash
slice引数で指定したキーのみを取り出すHash
except引数で指定したキー以外を取り出すHash
reverse_mergemergeと違って既にキーが存在している場合は変更しない。デフォルト値で初期化するときなどに使うHash
deep_merge二つのハッシュを再帰的にマージして(引数の方のHashが上書きする)新しいHashを返すHash
diff二つのハッシュの差分をとって(引数の方のHashが上書きしない)新しいHashを返すHash
singularize文字列を単数形にするString
pluralize文字列を複数形にするString
camelize小文字とアンダーバーで表現された単語を、大文字と小文字での表現に変換して返すString
classifyテーブル名をクラス名にするString
tableizeクラス名をテーブル名にするString
constantize同じ文字列の定数を返す。クラス名も定数なのでクラス名にするとクラスオブジェクトを返すString

メンバーのみ編集できます