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. 【Rails】modelを作成する
  2. 【WPテーマ自作】ローカル環境でWP開発ができる「Local」の導入
  3. 【Blender】複数バージョンを簡単に管理できる、BlenderLaunche…
  4. 【UE4】用語備忘録メモ
  5. 【Rails】findメソッドで連想配列から指定した値を検索する

関連記事

 
  1. Ruby on Rails

    【Rails】文字列からHTMLタグを取り除く方法

    Railsで、HTMLタグを取り除いて文字列を出力したい時があります。…

  2. Ruby on Rails

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

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

  3. Ruby on Rails

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

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

  4. Ruby on Rails

    【Rails】railsでIndex name ‘xxx’ on table…

    railsで、dbを変更するためにmigrationを実行した際、in…

  5. Ruby on Rails

    【Rails】RSpecのお作法メモ

    RSpecを書く機会が増えてきたので、記法の備忘録として記事にします…

カレンダー

2024年4月
1234567
891011121314
15161718192021
22232425262728
2930  

最近の記事

  1. 慣れれば3分!Bumpノードを使用した質感表現の方法

    Blender

    【Blender】Bumpを使用した質感表現の方法
  2. WordPress

    【WPテーマ自作】UnderScoresの導入
  3. Ruby on Rails

    【Rails】railsでIndex name ‘xxx’…
  4. Blender

    【Blender】拡張機能(アドオン)の基本的な使い方
  5. Blender

    起動時の設定をカスタムする【Blender】
PAGE TOP