モデルの作成とデータベースの利用
Rails アプリケーションでは SQLite や MySQL などのデータベースに接続し、データの追加や追加済みのデータを取得することができます。このようなデータベースとのやり取りを行うのがモデルです。ここでは Rails でモデルを使ってデータベースとのやり取りを行う方法について解説します。
※ モデルに関する詳細は「モデルとデータベース」をご参照下さい。
(Last modified: )
データベースの設定ファイル
※ このページでは、前のページで作成したコントローラーやビューを使用します。コントローラの作成方法については前のページの「コントローラとアクションの作成とルーティングの設定」、ビューの作成方法については「ビュー(テンプレート)を使ったHTMLページの作成」を参照されてください。
Rails アプリケーションを rails new を使って作成する時、明示的に指定しなければデータベースとして SQLite を使用するように設定されます。そしてアプリケーションからデータベースを利用する時の設定は、アプリケーションディレクトリの中の config\database.yml ファイルに記載されます。
database.yml ファイルはテキストファイルです。テキストエディタで開いてみると次のように表示されます。
# SQLite. Versions 3.8.0 and up are supported. # gem install sqlite3 # # Ensure the SQLite 3 gem is defined in your Gemfile # gem "sqlite3" # default: &default adapter: sqlite3 pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> timeout: 5000 development: <<: *default database: storage/development.sqlite3 # Warning: The database defined as "test" will be erased and # re-generated from your development database when you run "rake". # Do not set this db to the same as development or production. test: <<: *default database: storage/test.sqlite3 production: <<: *default database: storage/production.sqlite3
設定ファイルは「development」「test」「production」の3つのモードに分かれており、開発用、テスト用、本番用、で異なる設定が出来るようになっています。今回は SQLite 用に作成された設定ファイルですが、使用するデータベースを SQLite ではなく MySQL を利用する場合はユーザー名やパスワードの設定項目なども追加されます。
ここではこのファイルの細かい設定方法については省略しますが、開発モードで動かしている場合は SQLite のデータベースファイルが storage/development.sqlite3 という名前で作成されることだけ確認しておいて下さい。
development: <<: *default database: storage/development.sqlite3
データベースを作成する
それではまずデータベースを作成します。使用するデータベースの種類は SQLite や MySQL などがありますが、 Rails アプリケーションからデータベースを作成する場合は、コマンドプロンプトを起動しアプリケーションルートに移動してから次のようにコマンドを実行すればデータベースが作成されます。
rails db:create
アプリケーションディレクトリの中の storage ディレクトリを見てみると、開発用の development.sqlite3 とテスト用の test.sqlite3 データベースがそれぞれ作成されています。
モデルを作成する
次にモデルを作成します。コマンドプロンプトを起動し、アプリケーションディレクトリに移動してから次のように実行します。
rails generate model モデル名 rails generate model モデル名 フィールド名1:データ型1 ...
※ 後で説明いたしますが、モデルを作成するとマイグレーションファイルと呼ばれるテーブルの作成や更新のためのファイルも自動的に作成されます。 2 番目の書式を使った場合はテーブルに含むフィールド名とデータ型も同時に指定できます。今回はその部分は手動で行ないますので、最初の書式を使います。
今回は plan モデルを作成してみます。コマンドプロンプトを起動し、アプリケーションディレクトリに移動してから次のように実行してください。
rails generate model plan
モデルが作成されました。このとき次のようにいくつかのファイルやディレクトリが自動的に作成されます。
invoke active_record create db/migrate/20240615232056_create_plans.rb create app/models/plan.rb invoke test_unit create test/models/plan_test.rb create test/fixtures/plans.yml
この中の app/models/plan.rb が作成したモデルに関して記述されたファイルとなります。
plan.rb はテキストファイルです。 plan.rb ファイルをテキストエディタで開いてみます。
class Plan < ApplicationRecord end
このようにモデルを作成すると「ApplicationRecord」クラスを継承し、名前が「モデル名」のクラスが定義されます(モデル名の先頭は大文字となります)。
クラスの中身は何もありませんが、 ActiveRecord で定義されているメソッドをそのまま利用できるため、特に何も記述しなくてもデータの作成やデータの取得といった基本的な処理を行なうことができます。もちろん追加することもできます。
マイグレーションを使ったテーブル作成
モデルを作成した時に db\migrate\20240615232056_create_plans.rb というファイルも作成されています。これはマイグレーションスクリプトと呼ばれるファイルと呼ばれているものです。(ファイル名の数字の部分は作成した日時から付けられています)。
マイグレーションに関して簡単にご説明をしておきます。データベースは既に作成していますが、データを格納するにはテーブルを作成しなければなりません。 Rails とは関係無くデータベースの持つ機能を使ってテーブルを作成することはもちろん可能です。ただ Rails ではテーブルの作成や変更の仕組みとしてマイグレーションと呼ばれる機能が提供されています。
マイグレーションとは、例えばテーブルを作成するのに直接作成するのではなく、テーブルを作成するというスクリプトファイルを作成した上で、そのスクリプトを実行することでテーブルを作成するものです。
それでは作成された db\migrate\20240615232056_create_plans.rb ファイルをテキストエディタで開いてみます。
class CreatePlans < ActiveRecord::Migration[7.1] def change create_table :plans do |t| t.timestamps end end end
このマイグレーションファイルの中に、作成するテーブルに関する情報を記載していきます。
今回は title カラムと plan_date カラムを持つ plans テーブルを作成します。(テーブル名はモデル名を複数形にしたものです)。マイグレーションファイルに次のように記載してください。
class CreatePlans < ActiveRecord::Migration[7.1]
def change
create_table :plans do |t|
t.string :title
t.date :plan_date
t.timestamps
end
end
end
これでマイグレーションの準備はできました。
ではコマンドプロンプトを起動し、アプリケーションディレクトリに移動してから次のようにコマンドを実行してください。(少し時間がかかります)。
rails db:migrate
今回作成したマイグレーションスクリプトはテーブルを作成するものですので、スクリプトを実行するとデータベースの中にテーブルが作成されます。
テスト用データの作成
モデルの作成とデータベース側で必要なテーブルの作成までは完了しました。簡単なサンプルを作成するために、テーブルにいくつかデータを登録しておきます。
Railsではテーブルにデータを登録する仕組みが用意されています。アプリケーションディレクトリの中の db/seeds.rb ファイルを使用します。
このファイルをテキストエディタで開いてください。
現在はコメントのみ記載されています。このファイルの最後に plan テーブルに追加するデータを次のような形で入力してください。
Plan.create(:title => '書類提出日', :plan_date => '2023-10-01') Plan.create(:title => '家族と動物園へ', :plan_date => '2024-03-15') Plan.create(:title => '来客', :plan_date => '2024-05-28')
ではコマンドプロンプトを起動し、アプリケーションディレクトリに移動してから先程記述したスクリプトを実行して下さい。
rails db:seed
plans テーブルに 3 つのデータが追加されました。
では念の為に確認しておきます。 SQLite のコマンドラインツールである sqlite3.exe が PATH の通っている場所に設置してある場合、コマンドプロンプトを起動し、アプリケーションディレクトリに移動してから次のように実行して下さい。 config/database.yml に記載されている設定に従い、 SQLite のコマンドラインツールが起動します。
rails dbconsole
plans テーブルからデータを取得します。次のような SQL 文を実行してください。
select * from plans;
3 つのデータが plans テーブルに追加されていることが確認できました。
SQLite コマンドラインツールを閉じる場合は .exit と実行して下さい。
モデルを使ってデータベースのデータを取得
それではモデルを使ってデータベースのデータを取得してみます。まずアクションメソッドを書き換えます。 app\controllers\plans_controller.rb ファイルをテキストエディタで開いて下さい。
class PlansController < ApplicationController def hello @msg = '山田さん' end def bye render :plain => 'bye!' end end
既にあるアクションを削除して、 disp アクションを次のように記述しました。
class PlansController < ApplicationController
def disp
@plans = Plan.all
end
end
Plan モデルの all メソッドはテーブルに含まれるすべてのデータをモデルクラスのオブジェクトの配列として返します。今回は返された配列を変数 plans に格納しています。
続いてルーティングを編集します。 config\routes.rb ファイルをテキストエディタで開いて下さい。
Rails.application.routes.draw do # Define your application routes per the DSL in https://guides.rubyonrails.org/routing.html # Reveal health status on /up that returns 200 if the app boots with no exceptions, otherwise 500. # Can be used by load balancers and uptime monitors to verify that the app is live. get "up" => "rails/health#show", as: :rails_health_check # Defines the root path route ("/") # root "posts#index" get 'hello', to: 'plans#hello' get 'bye', to: 'plans#bye' end
次のように変更します。
Rails.application.routes.draw do
# Define your application routes per the DSL in https://guides.rubyonrails.org/routing.html
# Reveal health status on /up that returns 200 if the app boots with no exceptions, otherwise 500.
# Can be used by load balancers and uptime monitors to verify that the app is live.
get "up" => "rails/health#show", as: :rails_health_check
# Defines the root path route ("/")
# root "posts#index"
get 'disp', to: 'plans#disp'
end
最後にビューを編集します。 app\views\plans\disp.html.erb ファイルを新規に作成し、次のように記述しました。
<h1>登録されている予定</h1> <p> <% @plans.each do |plan| %> [内容] <%= plan.title %>, [日付] <%= plan.plan_date %><br> <% end %> </p>
アクションから渡されてきたモデルクラスのオブジェクトの配列の数だけ順に内容と日付を取得して画面に表示します。
動作確認
それでは Rails アプリケーションを起動してここまでの動作を確認してみます。コマンドプロンプトを起動し、アプリケーションディレクトリへ移動し、 rails server と実行して下さい。
ブラウザから次のURLへアクセスして下さい。
http://localhost:3000/disp
plans コントローラの disp アクションが呼び出され、アクションの中でモデルを使ってデータベースからデータを取得し、最終的に対応するビューが呼び出されて画面に次のように表示されます。
このようにモデルを利用してデータベースからデータを取得し、そのデータを使った結果を利用者のブラウザ上に表示させることができました。
以上でサンプルアプリケーションを使った動作確認は完了です。コントローラとアクション、ビュー、そしてモデルについては別のページにてより細かい利用方法について解説を行ないます。
-- --
Rails でモデルを使ってデータベースとのやり取りを行う方法について解説しました。
( Written by Tatsuo Ikura )
著者 / TATSUO IKURA
プログラミングや開発環境構築の解説サイトを運営しています。