21
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

🔰【rails】テーブルから「レコード取得」➡「レコードの値加工」に役立つメソッド

Last updated at Posted at 2022-09-18

どうもaono1234と申します。記事がいいなと思ったらtwitterのフォローもお待ちしております‼
https://twitter.com/takeshi_program

今日はrailsでよく使うメソッド達を順序立てて皆さんにいくつか紹介したいと思います。😆
(すぐに結論を見たい人は2.先に結論の関係図をみて頂ければ幸いです。)

プログラムは大まかには以下3つのフェーズに大別することができます。

  1. データベースから特定レコードを取得する。
  2. 取得したものを使いやすいように加工する。
  3. view(ブラウザ)で表示させる。

今回の記事では1.2.の部分でよく使われる便利メソッドを紹介したいと思いますので、
よろしくお願い致します。😄

1. はじめに

本記事は以下の読者が対象です。

  • プログラミング初学者
  • rails を使い始めたばかりの人
  • eachメソッドを使ったことがある人

2. 先に結論

  • 取得用の便利メソッド
    • find
    • find_by
    • where
  • 加工用の便利メソッド
    • ids
    • pluck

各メソッドの関係図
image.png

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.取得用メソッドと加工用メソッドの関係図

紹介したメソッド達を関係図としてまとめました。
image.png

6. さいごに

どうでしたでしょうか?紹介したメソッドは参考になりましたでしょうか?

私はそれぞれのメソッドを単体で知った時はどのようなメリットがあるのかイメージが湧きませんでした。
しかし、各メソッドの繋がり・全体像を知ることで適材適所に合ったメソッドが使えるようになったと思います。

今後も便利なメソッドを紹介できればと思っておりますので、
次回の記事もご覧になって頂けると幸いです!😀

21
9
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
21
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?