【rails】データの保存・取得とActiveRecord

※本サイトで紹介している商品・サービス等の外部リンクには、アフィリエイト広告が含まれる場合があります。

データベースにデータを保存する

前回作ったデータベースに、試しにデータを保存、取得してみる


rails c

warp画面で$ rails cを入力し、コンソール画面を立ち上げる


モデル名.create()

以下のデータを保存してみる

  • title:title
  • content:ブログだよ!!
Article.create(title: 'title', content: 'ブログだよ!!')

↓ すると、railsが自動でSQLを実行してくれる!

INSERT INTO "articles" 
("title", "content", "created_at", "updated_at")
VALUES (?, ?, ?, ?)  [
["title", "title"], 
["content", "ブログだよ!!"], 
["created_at", "2024-08-10 05:14:56.690198"],
 ["updated_at", "2024-08-10 05:14:56.690198"]
]

あわせて、「created_at」「updated_at」も保存してくれている


Article.first

Article.first で最初の記事を確認できる


ActiveRecordを使用している

↓ ArticleモデルはApplicationRecordを継承している

↓ ApplicationRecordはActiveRecord::Baseを継承している

このActiveRecordを継承しているおかげで、たくさんのことができる

SQLを書かずにSQLを実行することだって出来る

ActiveRecordは直感で書けるのでSQLより断然書きやすい!

ORマッパー

SQLを直接書かずにSQLを実行する機能を「ORマッパー」と呼び、railsはその中のActiveRecordを使っている


データを取得する

↓HomeControllerに以下を入力する

class HomeController < ApplicationController

    def index
        # Articleの一番最初の記事を変数にいれる
        @article = Article.first
    end

end

↓view(html)に以下を記載する

<h2><%= @article.title %></h2>
<h2><%= @article.content %></h2>

  1. Article.firstで最初の記事を取得
  2. 変数「@article」に入れる
  3. 「@article.title」「@article.content」と使える

最初の記事が表示される


MVCという概念

controllerがmodelからデータを持ってきて、viewでhtmlを表示する


「.find」と「.find_by」について

モデル名.find(◯)

idを指定して、レコードを取得する

例)Article.find(5)


モデル名.find_by(カラム名: “◯◯”)

id以外でレコードを検索する

例)Article.find_by(title: "素晴らしい記事")


.findと.find_byで結果が違う

例)id: 1のレコードを確認したい

Article.find(1)
# エラーが発生して処理が止まる
Article.find_by(id: 1)
# 正しく動き、nil が返ってくる

「id:1」に情報が入っているのか(存在しているか確認したい

→ .find_byを使う


「first」「second」「third」と「last」について

開発時、適当にレコードを取得したいとき、デバックに使いたいときに

  • 1番目の情報を取得したい
    → Article.fist
  • 2番目の情報を取得したい
    → Article.second
  • 3番目の情報を取得したい
    → Article.third ・・・
  • 最後の情報を取得したい
    → Article.last

「all」「order」「limit」について

モデル名.all

Article.allですべての情報を取得できる

Article.allとは、Article.firstのようなレコードが複数集まっているもの

「配列」になっているため、Article.all.eachで複数回、実行することができる


モデル名.all.order(:カラム名)

Article.all.order()で、データをすべて取得したあとの処理も指定できる

例)Article.all.order(:id)

Articleのレコードをidが小さい順に並べ替える(昇順)

例)Article.all.order(id: :desc)

Articleのレコードをidが大きい順(:desc)に並び替える(降順)


モデル名.all.limit(◯)

膨大なレコードがある場合、.allでは負荷がかかりすぎる

→ .limit(◯)で取得するレコードの数を限定する

例)Article.all.limit(3)

Articleのすべてのレコードから3件だけ取得する


モデル名.all.order(:カラム名).◯◯

さらに指示を追加することができる

例)Article.all.order(id: :desc).first

Articleのレコードを降順に並び替えて、1番目のレコードを取得する

例)Article.all.order(id: :desc).limit(3)

Articleのレコードを降順に並び替えて、3件だけレコードを取得する

組み合わせてレコードを取得することができる


「where」「count」について

モデル名.where(カラム名: ◯)

条件にあったレコードをすべて取得する

例)Article.where(id: 5)

id:5の条件にあった1件が取得できる

結果1件しか取得できなくても、配列に入っている

取得したレコードは1件なので、article.titleでid:5のタイトル情報が取得できそう

取得したレコードは配列[article]に入っているので、正しく指定する


エラー回避するための正しいコード

id:24に該当するレコードのうち、インデックス番号[0]のタイトル

Article.where(id:24)[0].title
 # => "素晴らしい記事"

id:24に該当するレコードのうち、最初のレコードのタイトル

Article.where(id:24).first.title
 # => "素晴らしい記事"

モデル名.where(‘◯◯’)

条件をつけてレコードを取得する

例)Article.where('id > 5')

idが5より大きいレコードをすべて取得できる

別の書き方(やっていることは同じ)

Article.where('id > ?', 5)

「?」に代入する形で、第2引数に条件を入力する


モデル名.where.(‘◯◯’).count

条件を指定したとき、レコードが何件取得できたか教えてくれる

#DAY7