Ruby on Rails

【Rails】selectメソッドで特定の条件を満たす要素を取得する

今回は、配列の中から特定の条件で要素を探すための
selectメソッドについて、基本的な使い方を紹介します。

先に、この記事で説明するコードを
さらっと載せておきます。

その後に、それぞれの書き方について
具体的な説明をしていきたいと思います。

目次

  1. 結論
  2. 環境
  3. selectメソッドの概要
  4. 基本的な使い方
  5. findとの違い
  6. 連想配列に対して使う
    1. keyで探す
    2. valueで探す
    3. ハッシュ配列に対して使う
  7. まとめ

結論

要素に対してブロック内を評価した値が
真(true)であった要素を、全て含む配列を返します。

真である要素が一つもない場合には、空配列を返します。

array = ["ミミッキュ", "サンダー", "エースバーン"]

# 要素は配列で返ってくる
array.select { |value| value.include?('ン') }
=> ["サンダー", "エースバーン"]

似たようなメソッドにfindがあります。

array = ["ミミッキュ", "サンダー", "エースバーン"]

# 要素が1つだけ返ってくる
array.find {|value| value.include?('ン')}
=> "サンダー"

ハッシュに対して使う場合

# 連想配列の場合、第一引数はkey、第二引数はvalue
hash = { ghost: "ミミッキュ", flying: "サンダー", fire: "エースバーン" }

hash.select { |key| key == :ghost }
=> {:ghost=>"ミミッキュ"}

hash.select { |key, value| value.include?('ン') }
=> {:flying=>"サンダー", :fire=>"エースバーン"}

ハッシュ配列に対して使う場合

hash = [
 { id: 145, name: "サンダー", height: 1.6, weight: 52.6 },
 { id: 778, name: "ミミッキュ", height: 0.2, weight: 0.7 },
 { id: 3, name: "エースバーン", height: 1.4, weight: 33.0 }
]

# 第一引数にハッシュが渡ってくるので、hash[:key]でアクセスできる
hash.select { |value| value[:name].include?('ン') && value[:height] <= 1.5 }
=> [{:id=>3, :name=>"エースバーン", :height=>1.4, :weight=>33.0}]

環境

OS: MacOS
メモリ: 32GB

Dependents
Rails6
Ruby 2.6
CentOS7 on Vagrant
Mysql 5.7

selectメソッドの概要

要素に対してブロック内を評価した値が
真(true)であった要素を、全て含む配列を返します。

真である要素が一つもない場合には、空配列を返します。

ActiveRecordにも、同じselectメソッドがありますが
こちらは取得したレコードから、引数に渡したカラム名の値を取得したい時に使います。
mysqlのselectですね!

今回紹介するのは、Rubyのメソッドです。

基本的な使い方

公式リファレンスはこちらです。
instance method Enumerable#select

配列に対して使います。
例えばこんな配列があったとして

array = ["ミミッキュ", "サンダー", "エースバーン"]

名前に「ン」が入っているものだけを取得したい時は、このようになります。

array.select { |value| value.include?('ン') }
=> ["サンダー", "エースバーン"]

include? は、引数に渡された値が配列に含まれているかをチェックするメソッドです。

findとの違い

配列から要素を取得するメソッドには、findもあります。
findとselectの違いも見てみましょう。

公式リファレンスはこちらです。
instance method Enumerable#find

このブログでも、以前にfindメソッドの使い方を紹介しています。

findは、要素に対してブロックを評価
真(true)であった最初の要素を返します。

selectの時は
真(true)であった要素を、全て含む配列 でしたね。
selectとfindの違いはここにあります。
試しに、さっきと同じブロックをfindに渡してみましょう。

array = ["ミミッキュ", "サンダー", "エースバーン"]

array.find {|value| value.include?('ン')}
=> "サンダー"

先ほどは配列で返ってきたのに対して
findの時は、要素が1つだけ返ってきました。

最新の要素を取り出したい場合などに便利なメソッドですね。

連想配列に対して使う

では、少し応用してみましょう。
今までのサンプルは、1次元配列に対してselectを使用していました。
次は連想配列(ハッシュ)に対してselectを使ってみます。

keyで探す

タイプをkeyとして、名前を保持しているハッシュを用意しました。

hash = { ghost: "ミミッキュ", flying: "サンダー", fire: "エースバーン" }

例えば、keyがghostの要素をselectで探してみます。

hash.select { |key| key == :ghost }
=> {:ghost=>"ミミッキュ"}

無事に取得できました!

また、連想配列に対しては
select { |key, value| } と書くことで、
それぞれkeyとその値にアクセスすることもできます。

valueで探す

次は、名前で探してみましょう。

# 連想配列の場合、第一引数はkeyなので、第二引数で探す
hash.select { |key, value| value.include?('ン') }
=> {:flying=>"サンダー", :fire=>"エースバーン"}

上手く取得できました!

ハッシュ配列に対して使う

では最後に、ハッシュの配列に対して
selectで要素を取得してみましょう。

図鑑番号、名前、高さ、重さを保持したハッシュ配列を用意しました。

hash = [
 { id: 145, name: "サンダー", height: 1.6, weight: 52.6 },
 { id: 778, name: "ミミッキュ", height: 0.2, weight: 0.7 },
 { id: 3, name: "エースバーン", height: 1.4, weight: 33.0 }
]

では、名前にンが入り、高さが1.5以下の要素をselectしてみましょう。

hash.select { |value| value[:name].include?('ン') && value[:height] <= 1.5 }
=> [{:id=>3, :name=>"エースバーン", :height=>1.4, :weight=>33.0}]

こんな感じになります、無事にselectできましたね。

まとめ

今回は、Rubyのselectメソッドについて基本的な使い方
連想配列や、ハッシュ配列に対する使い方を紹介しました。

また、似たようなメソッドのfindとの違いについても紹介しました。
findについては、別の記事でも紹介しています。

実際にRailsアプリで使用する時には、
ActiveRecordから取得してきたレコード群に対して
特定の条件で絞り込みをしたい時などに使うと便利かと思います。

ピックアップ記事

  1. 【Blender】拡張機能(アドオン)の基本的な使い方
  2. 【Blender】MMDファイルをBlenderにImportするアドオン
  3. 【Blender】起動時に強制終了してしまう問題
  4. 【CSS】おしゃれなラジオボタンを作る
  5. 【Rails】selectメソッドで特定の条件を満たす要素を取得する

関連記事

 
  1. 【Rails】オブジェクトの中身をログに出力する

    Ruby on Rails

    【Rails】オブジェクトの中身をログに出力する

    オブジェクトの中身をデバッグしたりする時に便利出力結果をみやすい形に…

  2. railsをproductionモードで実行する

    Ruby on Rails

    【Rails】railsをproductionモードで実行する

    結論--environmentオプションを使用します。…

  3. Ruby on Rails

    【Rails】development? production? 開発環境ごとに処理を切り分けたい時

    Railsで、開発環境ごとに処理を切り替えたい時の方法を紹介します。ま…

  4. Ruby on Rails

    【Rails】migrationでカラムを追加・削除したい

    migrationファイルでよく使う記述。テーブルにカラムを追加・削…

  5. Ruby on Rails

    【Rails】ActiveStorageで添付ファイルを削除したいときは、purgeを使う

    動作確認するために、active_storageでアップロードした画…

  6. Ruby on Rails

    【Rails】レコードが保存済みか確認するpersisted?メソッド

    レコードが保存されているかどうかでUIの表示を切り替えたり、保存されて…

カレンダー

2024年5月
 12345
6789101112
13141516171819
20212223242526
2728293031  

最近の記事

  1. Blender

    【Blender】レンダリング結果を新規ウィンドウで開かないようにする
  2. Blender

    【Blender】アニメーションでポーズを左右反転してコピペしたい時
  3. Blender

    【Blender】zip版のBlenderをBlender Launcherに移…
  4. gitでファイル変更の一部をコミットする

    git

    git add -p でファイルの一部をコミットする【Git】
  5. Blender

    【Blender】起動時に強制終了してしまう問題
PAGE TOP