はじめに
こんにちは。アメリカ在住で独学エンジニアを目指している Taira です。
Rails を触っているとよく目にする compact / compact_blank / empty?。似ているようで役割が違うので、整理してまとめました。
🔹 1. compact(Ruby 標準)
nilだけを取り除く- Ruby 標準メソッド(Array, Hash)
[1, nil, 2, "", [], false].compact
# => [1, 2, "", [], false]
👉 空文字や空配列は残ります。
🔹 2. compact_blank(Rails 拡張)
blank?が true のものを取り除く- Rails が Array/Hash に追加した便利メソッド
-
blank?とは? →nil, 空文字"", 空白文字列" ", 空配列[], 空ハッシュ{}などを判定
[1, nil, 2, "", [], false].compact_blank
# => [1, 2, false]
{ a: nil, b: "", c: [], d: "ok" }.compact_blank
# => { d: "ok" }
👉 false は blank? ではないので残ります。
🔹 3. empty?(Ruby 標準)
- 単一オブジェクトに対して「中身が空かどうか」を判定
- 真偽値を返す (
true/false)
"".empty? # => true
[].empty? # => true
{}.empty? # => true
[1].empty? # => false
"hi".empty? # => false
👉 配列や文字列が「空かどうか」を確認するだけで、中の要素を削除はしません。
✅ 違いまとめ表
| メソッド | 適用対象 | 動作 | 返り値 |
|---|---|---|---|
compact |
Array / Hash |
nil を削除 |
新しい配列/ハッシュ |
compact_blank |
Array / Hash |
blank? == true を削除 |
新しい配列/ハッシュ |
empty? |
単一オブジェクト | 中身が空かどうかを判定 |
true / false
|
💡 使い分けの目安
-
nilだけ消したい →compact -
空文字・空配列も一緒に消したい →
compact_blank -
オブジェクトが空か判定したい →
empty?
実務での例
-
フォーム入力の params の掃除 →
params.compact_blank -
入力チェック →
value.empty?や Rails ならvalue.blank?