Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
4
Help us understand the problem. What is going on with this article?
@ryosuketter

RailsのModelで使うCRUD用メソッドについて

More than 1 year has passed since last update.

CRUDとは

CRUD(クラッド)とは、ほとんど全てのコンピュータソフトウェアが持つ永続性(データを生成したプログラムが終了してもそのデータが存続する特性)の4つの基本機能のイニシャルを並べた用語。

Wikipedia / CRUD

データベースアプリケーション

CRUD はリレーショナルデータベースやRESTfulなWebアプリケーションで実装する必要のある主な機能を列挙したものと見ることができる。各文字は標準のSQL文に次のようにマッピング可能である。

名前 操作 SQL
Create 生成 INSERT
Read 読み取り SELECT
Update 更新 UPDATE
Delete 削除 DELETE

環境

  • Ruby 2.4.1
  • Rails 5.0.7

Modelの下準備

リソースの操作対象となる Model から作成していきます。

Modelの作成

下記コマンドで、Articleモデルを作成します。Articlecontent というメッセージ内容(文字列)を持つようにします。

$ rails g model Article content:string

上記のコマンドによって、下記のファイルを自動生成しました。

  • db/migrate/20180604042236_create_articles.rb
    • これはマイグレーションファイルで、Railsからデータベースのテーブルを管理するためのファイル
    • ファイルの中身はarticlesテーブル作成のコマンドです(モデルはArticle
    • マイグレーションファイルが作成しただけではテーブルを作成できません。作成は↓
    • マイグレーションファイルの実行はrails db:migrate
    • 今後もテーブルを作成したり変更したりするときはマイグレーションファイルで管理します
  • app/models/article.rb
    • このファイル(モデルファイル)を開くとApplicationRecordクラスを継承している
    • app/models/application_record.rbをみるとApplicationRecordクラスは、ActiveRecord::Baseを継承している
    • なので、Articleモデルにはそれらの機能が全て入っていてArticleクラスにコードがなくてもモデル操作できるようになります
    • ActiveRecordを継承することによって、SQLをあまり書かず、Rubyだけでレコードを操作が可能になります

Modelで使えるCRUD用メソッド一覧

メソッド名 用途
all 全レコードを取得
new 新規レコードのモデルインスタンスを作成
find id指定で検索
find_by id以外でも指定して検索
where 検索条件を文字列、配列、ハッシュのどれかで与えれる
first 最初のレコードを1件だけ取得
save レコードの作成
update, save データの更新
destroy データの削除

モデルのメソッドを使うと、SQLを書くことがほとんど無くなります

上記のメソッドは、モデルのインスタンス.メソッド名で使用します。

rails consoleでモデルのCRUD操作

$ rails c

モデルの一覧を確認

Article.allはDB上に保存されているArticleモデルのレコード一覧を確認できます。まだカラ(#<ActiveRecord::Relation []>)ですが。

> Article.all
  Article Load (0.3ms)  SELECT `articles`.* FROM `articles`
 => #<ActiveRecord::Relation []> 

モデルのインスタンスを作成

モデルのインスタンスは new で作成し、変数に代入します

> article = Article.new(content: 'something')
 => #<Article id: nil, content: "something", created_at: nil, updated_at: nil>

変数に代入したので、変数だけでも実行できます。

> article
 => #<Article id: nil, content: "something", created_at: nil, updated_at: nil>

変数だけで、インスタンスの内容が確認できました。

モデルのインスタンスに値を代入

> article.content = 'something_updated'
 => "something_updated" 

ですが、まだArticle.allしても確認できません。

モデルのインスタンスをDBに保存

> article
 => #<Article id: nil, content: "something_updated", created_at: nil, updated_at: nil> 
2.4.1 :008 > article.save
   (0.4ms)  BEGIN
  SQL (0.2ms)  INSERT INTO `articles` (`content`, `created_at`, `updated_at`) VALUES ('something_updated', '2018-06-04 06:01:12', '2018-06-04 06:01:12')
   (2.0ms)  COMMIT
 => true 

article.saveを実行すると、自動的にデータベース内のarticlesテーブルに保存されます。これに関してですが、モデル名とテーブル名には命名ルールがあります。articlesテーブルとモデルを関連付けたい場合には、モデル名は先頭が大文字の単数形Articleでなければいけません。

モデル テーブル
Article(先頭が大文字の単数形) articles(複数形)

これで、Railsを経由して、データがINSERTされたので、Article.allで確認できるかと思います。

> Article.all
  Article Load (0.3ms)  SELECT `articles`.* FROM `articles`
 => #<ActiveRecord::Relation [#<Article id: 1, content: "something_updated", created_at: "2018-06-04 06:01:12", updated_at: "2018-06-04 06:01:12">]> 

モデルのインスタンスを取得

何個かレコードを作成

article = Article.new(content: 'something2')
article.save
article = Article.new(content: 'something3')
article.save

all

レコード全体を取得します。

first

最初のインスタンスを1つだけ取得します。

find

idから検索し、レコードを検索して任意のレコードを1つ取得します。

> Article.find(1)
  Article Load (0.4ms)  SELECT  `articles`.* FROM `articles` WHERE `articles`.`id` = 1 LIMIT 1
 => #<Article id: 1, content: "something_updated", created_at: "2018-06-04 06:01:12", updated_at: "2018-06-04 06:01:12"> 

find_by

上のfindと違うポイントは、 id以外でも検索・取得できます。

> Article.find_by(content: 'something2')
  Article Load (0.3ms)  SELECT  `articles`.* FROM `articles` WHERE `articles`.`content` = 'something2' LIMIT 1
 => #<Article id: 2, content: "something2", created_at: "2018-06-04 06:20:18", updated_at: "2018-06-04 06:20:18"> 

where

> Article.where(content: 'something3')
  Article Load (0.6ms)  SELECT `articles`.* FROM `articles` WHERE `articles`.`content` = 'something3'
 => #<ActiveRecord::Relation [#<Article id: 3, content: "something3", created_at: "2018-06-04 06:20:24", updated_at: "2018-06-04 06:20:24">]>  

また、whereは、allと同じく複数取得が可能です。比較演算子を用いることもできます。

> Article.where('id >=2')
  Article Load (0.4ms)  SELECT `articles`.* FROM `articles` WHERE (id >=2)
 => #<ActiveRecord::Relation [#<Article id: 2, content: "something2", created_at: "2018-06-04 06:20:18", updated_at: "2018-06-04 06:20:18">, #<Article id: 3, content: "something3", created_at: "2018-06-04 06:20:24", updated_at: "2018-06-04 06:20:24">]>

レコードの更新(Update)

レコードの更新には Update を使用します。

Article.first.update(content: 'なにか')
  Article Load (0.6ms)  SELECT  `articles`.* FROM `articles` ORDER BY `articles`.`id` ASC LIMIT 1
   (0.1ms)  BEGIN
  SQL (0.2ms)  UPDATE `articles` SET `content` = 'なにか', `updated_at` = '2018-06-04 06:37:04' WHERE `articles`.`id` = 1
   (1.8ms)  COMMIT
 => true 

レコードの削除(Delete)

レコードの削除には destroy を使用します。allメソッドで取得したら消されたことが確認できます。

> Article.first.destroy
  Article Load (0.4ms)  SELECT  `articles`.* FROM `articles` ORDER BY `articles`.`id` ASC LIMIT 1
   (0.1ms)  BEGIN
  SQL (0.1ms)  DELETE FROM `articles` WHERE `articles`.`id` = 1
   (1.6ms)  COMMIT
 => #<Article id: 1, content: "なにか", created_at: "2018-06-04 06:01:12", updated_at: "2018-06-04 06:37:04"> 

> Article.all
  Article Load (0.4ms)  SELECT `articles`.* FROM `articles`
 => #<ActiveRecord::Relation [#<Article id: 2, content: "something2", created_at: "2018-06-04 06:20:18", updated_at: "2018-06-04 06:20:18">, #<Article id: 3, content: "something3", created_at: "2018-06-04 06:20:24", updated_at: "2018-06-04 06:20:24">]> 

以上です。ありがとうございました。

4
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
life-a-tm
人生のイベントや日常生活に密着した比較サイト、情報サイト等様々なウェブサービスを企画・開発・運営

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
4
Help us understand the problem. What is going on with this article?