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】Bumpを使用した質感表現の方法
  2. 【MySQL】mysqlで新しくユーザーを追加する
  3. 【Rails】findメソッドで連想配列から指定した値を検索する
  4. 【Rails】modelを作成する
  5. 【Rails】development? production? 開発環境ごとに処…

関連記事

 
  1. Ruby on Rails

    【Rails】Factory already registered: エラー

    railsでアプリ開発中、最新のfeatureブランチでリベースして…

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

    Ruby on Rails

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

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

  3. Ruby on Rails

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

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

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

    Ruby on Rails

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

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

  5. Ruby on Rails

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

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

カレンダー

2021年12月
 12345
6789101112
13141516171819
20212223242526
2728293031  

最近の記事

  1. Blenderの複数バージョンを簡単に管理できるBlenderLauncherの使い方

    Blender

    【Blender】複数バージョンを簡単に管理できる、BlenderLaunche…
  2. 慣れれば3分!Bumpノードを使用した質感表現の方法

    Blender

    【Blender】Bumpを使用した質感表現の方法
  3. Ruby on Rails

    【Rails】findメソッドで連想配列から指定した値を検索する
  4. Ruby on Rails

    【Rails】modelを作成する
  5. WordPress

    【WPテーマ自作】UnderScoresの導入
PAGE TOP