3
4

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.

レビュー時の勘所2 ActiveRecordのオブジェクトから何かを作る

Last updated at Posted at 2015-05-06

たとえば、一部のattributeだけを突っ込んだArrayを作りたい場合

result = [
	  user.first_name,
	  user.last_name,
	  user.birthday
	]

こんなかんじに書かず、Hash#sliceを書くと少しシンプル?に

result = user.slice(*%w(first_name last_name birthday)).values

こう書ける

指摘+αで少し調べた。(詳しくはコメ欄)

  • 実はsliceに渡すのはString(%w)じゃなくてSymbol(%i)じゃなくてOK
    • result = user.slice(*%i(first_name last_name birthday)).values
    • 手元で適当に試したところ、元のものから6%ほど高速化
  • というかsliceしてvaluesするのなんかよりmapしてsendしたほうが早い
    • result = %i(first_name last_name birthday).map{|m| user.send m}
    • これまた手元で適当に試したところ、元のものから84.5%ほど高速化

うーん。map使うのはなんとなく主語にあたるuserがうしろに行きすぎて読みづらいんだけどこの速度差なら許容できる程度の誤差だな・・・

sliceは内部でObject#public_sendを使っているので、sendで使えるものならなんでも(attributesに限らずメソッドでも)同様に処理することが出来る。

おそらくRubyのHashがOrderedHashになったからだと思うけれど、sliceに渡すキーの順番を変えると、valuesのArrayの順番もそれに従って変化する。

3
4
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
3
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?