windows10でRuby on rails 05-モデル作成とデータベースの利用

Ruby
この記事は約7分で読めます。

前記事


概要

今回はモデルの作成と、データベースへのアクセスまでを行います。

データベースの設定

Railsのプロジェクトを作成する際、明示的にデータベースを指定しない場合はSQLiteを使用するよう設定され、その設定は[アプリケーションルート\config\database.yml]に保存されます。

前回までの記事で作成したプロジェクトはデータベースを特に指定していない為、SQLite用の設定ファイルが作成されており、内容は以下の通りです。

#SQLite version 3.x
#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: db/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: db/test.sqlite3
production:
<<: *default
database: db/production.sqlite3

設定ファイルを見ると、「development:」、「test」、「Production」の三つに分かれています。それぞれ開発用、テスト用、本番用となっており、異なる設定が出来るようになっています。

デフォルトでは「開発モード」が使われるようになっており、開発モードのDBファイルは[アプリケーションルート\db\]に[development.sqlite3]という名前で作成されています。
(この時点では0バイトのファイル)

データベースの作成

コマンドプロンプトでアプリケーションルートに移動し、railsの以下のコマンドでデータベースを作成可能。

bundle exec rake db:create

コマンド実行後、以下のようにtest.sqlite3が新たに作成されています。

モデルの作成

アプリケーションルートで以下のコマンドを実行します。

bundle exec rails generate model list

[test]の部分がモデル名です。
コマンドを実行するといくつかのファイルが作成されますが、[アプリケーションルート\app\models\list_test.vb]がモデルについて記述されたファイルです。

ここでモデル名に[-](ハイフン)を使用してはいけません。SQLiteの命名規約では禁止されている文字のため、modelとクラス名が正しく作成されなくなるようです。
上記画面にあるtest_tbl.rbが[-]を使用して作成したmodelですが、名称が[_](アンダーバー)に変わっており、ファイル中のクラス名は[TestTbl]となっており、統一されていない状態になってしまいました。

[list.rb]の中身は以下のようになっています。

class List < ApplicationRecord
end

モデルはApplicationRecordを継承したクラスとして作成されています。

テーブル作成

モデルを作成した時に、[20181107114709_create_lists.rb]というファイルも作成されています。このファイルは「マイグレーションスクリプト」と呼ばれるファイルです。

マイグレーションとは、データベースの操作を直接行うのではなく、スクリプトファイルを作成して実行することでテーブルの操作を行うものです。

  • テーブルに関して行う処理を記録しておくことで、元に戻したり他の環境で同じ処理を行ったりできる。
  • データベースの種類(SQLite、MySQL等)に関係なく同じスクリプトでテーブルを作成できる。

等のメリットがあります。

ファイルを開くと、以下のような内容が記述されています。

class CreateLists < ActiveRecord::Migration[5.2]
def change
create_table :lists do |t|

t.timestampsend
end
end
end

ここに追加したいフィールドを記述してやります。

class CreateLists < ActiveRecord::Migration[5.2]
def change
create_table :Lists do |t|
t.string :name

t.timestampsend
end
end
end

変更したファイルを文字コードUTF-8で保存します。

その後アプリケーションルートに移動してから以下のコマンドを実行することで、マイグレーションスクリプトが実行されます。

bundle exec rake db:migrate

これでlistsテーブルが作成されました。

データ作成

次はlistsテーブルにレコードを追加します。
[アプリケーションルート\db]フォルダの中に[seeds.rb]というファイルが作成されていますので、テキストエディタで開き、以下の3行を追加します。

# coding: utf-8
List.create(:name => 'ほげ' )
List.create(:name => 'ほげほげ' )

追加後、コンソールで以下のコマンドを入力します。

bundle exec rake db:seed

これで2つのレコードが追加されました。

次はレコードが正しく追加されているか確認します。
アプリケーションルートで次のコマンドを入力してください。

bundle exec rails dbconsole

プロジェクトで使用している設定に合わせて、データベースのコンソールが起動されます。今回のプロジェクトではSQLiteを使用しているため、上記のようにSQLiteのコンソールが起動されます。

ここで以下のSQL文を実行してテーブルの内容を確認します。

select * from lists;

テーブルの内容が表示され、2行が追加されている事が確認できます。コンソールは「ctrl+z」を入力してEnterキーで抜ける事が出来ます。

なお追加したname以外にも列がありますが、これはマイグレーションスクリプトに最初から記述されていた

t.timestamps

という1行で、レコードの作成日時、更新日時を格納する為に2つの列を作ってくれるからです。

データ取得と表示

データベースから情報を取得し、画面への表示を行います。

まず[アプリケーションルート\app\controllers]にある[testlist_controller.rb]を編集し、「hello」アクションを以下のように変更します。

    def hello
@lists = List.all
end

「List」モデルの「all」メソッドでテーブルに含まれる全てのデータを返します。取得したデータを変数「lists」に格納しています。

続いてビューの編集です。[アプリケーションルート\app\views\testlist]にある[hello.html.erb]を以下のように編集します。

<p>
現在のデータ内容は以下の通りです。
</p>
<p>
<% @lists.each do |list| %>
[名前] <%= list.name %>
<% end %>
</p>

データの件数分表示処理を繰り返して、name列の内容を表示します。

動作確認

動作の確認を行います。アプリケーションルートで以下のコマンドを入力し、サーバーを起動してください。

bundle exec rails s

サーバー起動後、ブラウザで「localhost:3000/testlist/」にアクセスします。

データ件数分のデータが表示されました。

コメント