読んで欲しい人
- selectメソッドがわからない人
- 過去の自分
動作環境
- ruby 3.3.0
- Rails 7.1.3.3
selectとは
- Enumerableモジュールの一部
- 文字列、配列、ハッシュに対して検索を行えるメソッド
Enumerableモジュールとは
- 繰り返し処理を行うためのモジュール
Enumerableモジュールに定義されているメソッドは全てeach
を用いて定義されてる。
each
を基盤として、より複雑な操作を簡単に行うための道具箱がEnumerableモジュールという感じ。
モデルに使う時
前提:下記のusersテーブルがあるとする
id | name | |
---|---|---|
1 | jojo | jojo@example.com |
2 | dio | dio@example.com |
3 | hoge | hoge@example.com |
普通に情報を取得すると下記
User.all
# 発行されるSQL
SELECT `users`.* FROM `users`
[ #<Cat id: 1, name: "jojo", email: "jojo@example.com", created_at.......>,
#<Cat id: 2, name: "dio", email: "dio@example.com", created_at.......>,
#<Cat id: 3, name: "hoge", email: "hoge@example.com", created_at.......>,
]
1. selectステートメントを利用する
select
の引数に指定カラムを入れると、指定したカラムのみの配列を取ってくれる
User.select(:name)
# 発行されるSQL
SELECT "users"."name" FROM "users"
[ #<User name: "jojo", id: nil>,
#<User name: "dio", id: nil>,
#<User name: "hoge", id: nil>,
]
2. ブロックを引数を利用して、配列のArray#selectメソッド的に使う
Array#selectメソッドを使用して、データベースから取得したオブジェクトの配列に対して条件を適用する場合
user.id.odd?
でtrueのみの要素で配列を作ってくれる
※odd?
は偶数かどうかを真偽で返してくれる
User.select { |user| user.id.odd? }
# 発行されるSQL
SELECT "users".* FROM "users"
[ #<Cat id: 1, name: "jojo", email: "jojo@example.com", created_at.......>,
#<Cat id: 3, name: "hoge", email: "hoge@example.com", created_at.......>,
]
配列に使う時
numbers = [1, 2, 3, 4, 5]
even_numbers = numbers.select { |number| number.even? }
puts even_numbers # => [2, 4]
numbers
配列の中身1つ1つをeven?
メソッドで確認して、true
のものだけを格納してる
※even?
は偶数かどうかを真偽で返してくれる
ハッシュに使う時
scores = {
alice: 85,
bob: 90,
charlie: 78,
diana: 92
}
# スコアが80以上の生徒だけを抽出
high_scorers = scores.select { |name, score| score >= 80 }
puts high_scorers # => {:alice=>85, :bob=>90, :diana=>92}
ハッシュにもいい感じ
学びと感想
- Railsを触っていて、当然ですがRubyのメソッドがわからないとお話にならないなと学べました
- 配列やハッシュを用いてデータを活用できれば、Railsでやれることが増えるなと思いました。
参考記事