どうもaono1234と申します。記事がいいなと思ったらtwitterのフォローもお待ちしております‼
https://twitter.com/takeshi_program
今日はrailsでよく使うメソッド達を順序立てて皆さんにいくつか紹介したいと思います。😆
(すぐに結論を見たい人は2.先に結論
の関係図をみて頂ければ幸いです。)
プログラムは大まかには以下3つのフェーズに大別することができます。
- データベースから特定レコードを取得する。
- 取得したものを使いやすいように加工する。
- view(ブラウザ)で表示させる。
今回の記事では1.
、2.
の部分でよく使われる便利メソッドを紹介したいと思いますので、
よろしくお願い致します。😄
1. はじめに
本記事は以下の読者が対象です。
- プログラミング初学者
- rails を使い始めたばかりの人
- eachメソッドを使ったことがある人
2. 先に結論
- 取得用の便利メソッド
- find
- find_by
- where
- 加工用の便利メソッド
- ids
- pluck
3. 取得用の便利メソッド
前提条件としてTask
というモデルをrails上で作ります。(モデルがなにか分からない人はrailsのMVC構造を学んでください)
このTask
モデルはtaks
テーブルを操作するクラスです。
tasks
テーブルには以下のid
カラムとname
カラムが定義されているとします。
id | name |
---|---|
1 | 掃除 |
2 | 朝礼 |
3 | 終礼 |
4 | 電話対応 |
3.1 findとfind_byについて
このtasks
テーブルから、name
カラムが掃除
のレコードを取り出したい時は
findメソッド
を使うと簡単に取得することができます。
Task.find(1) # id:1 のレコードが取得できる
今はid: 1
のnameカラムに掃除
があると分かっているからid: 1
のレコードを取得すればよいと判断できましたが
どのレコードに掃除が入っているか、わからない場合はどうすればよいでしょうか?
その場合に便利なのが find_by
メソッドです。
find_by
メソッドを使えば、条件に合ったレコードを検索し、取得することができます。
Task.find_by(name: '掃除') # id:1 のレコードが取得できる
ちなみにfind_by(id: 1)
とすればfind(1)
と同じことができます
find
メソッドは検索したが、レコードがひとつも該当しない場合エラーを出力する
Task.find(100) #tasksテーブルにはid:100というレコードはないためエラーが出力される
find_by
メソッドは、レコードがひとつも該当しない場合てもエラーを出力しない
Task.find_by(id: 100) #nilが出力される
3.2find_byとwhereについて
前述のとおりfind_by
は検索ができました。
しかし、find_by
メソッドの仕様として、「検索に最初に引っかかった1つのレコード」しか取得することができません。
そのため、以下のように
:nameカラムに掃除
が入っているレコードを全て取得したい場合、find_by
ではできません。
id | name |
---|---|
1 | 掃除 |
2 | 朝礼 |
3 | 終礼 |
4 | 電話対応 |
5 | 掃除 |
Task.find_by(name: '掃除') #id: 1 のレコードしか取得できない
この場合に役立つのがwhere
メソッドです。
Task.where(name: '掃除') #id: 1とid:5の複数レコードが入った配列を取得できる
where
の引数には配列を利用することもできます。
Task.where(name: ['掃除','朝礼']) #id: 1、id: 2、id:5の複数レコードが入った配列を取得できる
4. 加工用の便利メソッド
where
で取得したレコードたち
Task.where(name: ['掃除','朝礼']) # [レコード1,レコード2,レコード3]
を実際にブラウザで表示させる場合に
このままの状態では使い勝手が悪い場合がりあります。
4.1 eachメソッド
例えばレコードのid
だけ抽出して[1,2,5]
のような配列に変換したい場合です。
そんなときにもっとも簡便な方法としてeach
メソッドを使用するやり方があります。
tasks = [] #空の配列を用意
Task.where(name: ['掃除','朝礼']).each do |task|
tasks.push(task.id)
end
p tasks #[1,2,5]がtasksが出力される
このようにeach
メソッドを使えばid
だけを抽出した配列に変換することが可能です。
4.2 idsメソッド
each
メソッドは非常に汎用的なメソッドで便利なのですが、
railsではeach
メソッドを内包した、より便利なメソッドがあります。
その1つがids
メソッドです。
このメソッドはeach
メソッドの処理をids
メソッド内で行ってくれます。
p Task.where(name: ['掃除','朝礼']).ids #[1,2,5]がtasksが出力される
このようにids
メソッドを使えばコードが1行で済み、可読性を向上させることができます。
4.3 pluckメソッド
ids
メソッドを使えば、レコードの配列をワンタッチでid
だけの配列にできました。
しかし、id
だけではなく他のカラムでもしたくないですか?
そのような要望を満たしてくれるメソッドがpluck
メソッドです。
pluck
メソッドを使えば、id
以外のカラムについても同じような出力を得ることができます。
Task.where(name: ['掃除','朝礼']).pluck(:name) #[掃除,朝礼,掃除]が出力される
ちなみにpluck
メソッドの引数にid
カラムを指定してあげれば、ids
と同じことができます。
Task.where(name: ['掃除','朝礼']).pluck(:id) #[1,2,5]が出力される(idsと同じ出力)
5.取得用メソッドと加工用メソッドの関係図
6. さいごに
どうでしたでしょうか?紹介したメソッドは参考になりましたでしょうか?
私はそれぞれのメソッドを単体で知った時はどのようなメリットがあるのかイメージが湧きませんでした。
しかし、各メソッドの繋がり・全体像を知ることで適材適所に合ったメソッドが使えるようになったと思います。
今後も便利なメソッドを紹介できればと思っておりますので、
次回の記事もご覧になって頂けると幸いです!😀