Ruby on Railsのモデルはデータベースに作られるテーブル上のデータと密接に連携しています。例えばモデルを新しく作ったら、そのモデルに相当するテーブルがデータベースに作られます。SQLでデータベースを直接操作する必要はありませんが、Ruby on Railsからデータベースのテーブルを操作できるようになりましょう。
今回はRuby on Railsのコマンドからデータベースを扱うための基本的な方法について紹介します。
Ruby on Railsのデータベース設定
Ruby on Railsを使うには、少なくともRubyのパッケージ一式の他にデータベース管理ソフトが必要です。そのためRuby on RailsをWebシステムを構築するには、Rubyのパッケージといっしょにデータベース管理ソフトのパッケージもインストールされていなければなりません。
Ruby on Railsからデータベースを利用する方法を紹介する前に、データベース管理ソフトとの関係について紹介します。
標準はSQLite
Ruby on Railsの標準で設定されているデータベース管理ソフトはSQLiteです。もしこの状態で利用したい場合は、rbenvなどでRuby on Railsを利用するために必要なバージョンのRubyをインストールし、さらにSQLiteもインストールしなければなりません。
例えば下記のようにrails newコマンドにアプリケーション名のみ指定して新規にアプリケーションを作成した場合、標準のデータベースであるSQLiteを使用します。
$ rails new app1
データベースの設定ファイル
Ruby on Railsでアプリケーションを作成すると、そのデータベースの設定は、「config/database.yml」ファイルに記載されています。なおデータベース管理ソフトによっては、データにアクセスできるアカウントによる認証が必要ですが、それもこのファイルに記述してください。
データベースにSQLiteを設定している場合の「config/database.yml」ファイルの記載例を次に紹介します。
default: &default adapter: sqlite3 pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> timeout: 5000 development: <<: *default database: db/development.sqlite3
この「config/database.yml」ファイルには、「development:」、「test:」、「production:」の3つセクションにデータベースの設定が記述されています。そして通常rails serverコマンドでデバックする場合に適用されるのは、「development:」です。
利用するデータベースを指定する
rails newコマンドでアプリケーションを作成する際、SQLite以外のデータベース管理ソフトを指定できます。もしデータベースにMySQLを利用したい場合は、次のように実行してください。
$ rails new app -d mysql
なお、MySQLまたは互換性があるmariadbを利用する場合、データベースの設定ファイルに記載されたアカウントが使われます。rails newコマンドでアプリケーションを作成したら、「config/database.yml」ファイルを下記のようなMySQLやmariadbに設定に合わせて変更してください。
default: &default adapter: mysql2 encoding: utf8mb4 pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> username: (mariadbに登録したアカウント名) password: (mariadbに登録したアカウントのパスワード) socket: /var/run/mysqld/mysqld.sock development: <<: *default database: (mariadbに登録したデータベース名)
データベースとモデルの関係
Ruby on RailsのMVCモデルにおけるMは、モデル(Model)を意味します。そして、モデルの役割はWebシステムで使われるデータの格納で、主にデータベースとのやり取りを担当する機能です。
そのためモデルと作成した際、そのモデルに相当するテーブルがデータベースに作成されます。そのため、モデルを定義するにはデータベースのテーブルを意識しなければなりません。次からそのようなモデルとデータベースの関係について解説します。
モデルの作成の準備
Ruby on Railsでモデルを作成するには、データベースにテーブルを作れる状態でなければなりません。例えばLinuxでmariadbを利用する場合、さきほど紹介したようにmariadbに接続するためのアカウントやパスワードを「config/database.yml」ファイルに記述します。
そのうえで、Ruby on Railsのアプリケーションで使用するデータベースを作成してください。データベースの作成はmysqlコマンドからSQLにより作成しても構いませんが、次のコマンドでも作成可能です。
$ rails db:create
モデルを定義する
先ほど紹介したようにRuby on Railsにおけるモデルとは、Webシステムで利用するデータの保存などに利用される機能え、データベースのテーブルと連携します。ただし、モデルを作成したらすぐにデータベースにテーブルが作られる訳ではありません。モデルの作成コマンド実行後、データベースへの転送(migration)処理が必要です。
なおモデル作成には「rails generate model」コマンドを使います。
モデル作成コマンド
$ rails generate model モデル名 要素名:型:(unique|index) ….
データベースへへの転送(migration)処理コマンドは次のとおりです。
$ rails db:migrate
モデル作成の例
次から「rails generate model」コマンドを利用してモデルを作成する例を紹介します。
$ rails generate model db1 \ name:text \ attr:text \ code:integer \ flg:integer Running via Spring preloader in process **** invoke active_record create db/migrate/**************_create_db1s.rb create app/models/(データベース名).rb invoke test_unit create test/models/(データベース名)_test.rb create test/fixtures/(データベース名)s.yml $ rails db:migrate
上記のコマンドを実行すると、指定した要素の定義ファイルが「db/migrate」の下に作成されます。また、データベース上のテーブルが作成されるのは、転送(migration)処理コマンドの実行後です。そして転送(migration)処理コマンドは、下記の定義ファイルに基づいてテーブルを作成します。
定義ファイルの例
class CreateDb1s < ActiveRecord::Migration[6.1] def change create_table :db1s do |t| t.text :name t.text :attr t.integer :code t.integer :flg t.timestamps end end end
モデルの作り方
先ほど説明したように、Ruby on Railsのモデルを作成すると対応するデータベースのテーブルも同時に作成されます。そして、そのためにはモデル作成コマンドと転送(migration)処理コマンドの2つのコマンドを実行が必要です。
なお転送(migration)処理コマンドは、モデル作成コマンドによって作られた定義ファイルを基にデータベースにテーブルを作成します。つまり空のモデルを作成し、定義ファイルを編集して転送(migration)処理コマンドを実行しても、モデルの要素を設定できます。次にその例を紹介します。
空のモデルを作成する
先ほど紹介したモデル作成コマンドで要素を指定しなかった場合、空の定義ファイルが作られます。例えば、次のコマンドです。
$ rails generate model db2
そして、このコマンドで作られる転送(migration)処理コマンド用の定義ファイルは、次のとおりです。
class CreateDb1s < ActiveRecord::Migration[6.1] def change create_table :db1s do |t| end end end
見てのとおり、要素の無い空の定義ファイルが作られます。
空のモデルに要素を追加する
先ほど作成した空の定義ファイルにエディタなどでモデルとして使用する要素を追加することが可能です。そして、要素を追加後に転送(migration)処理コマンドを実行することで、データベースにモデルに対応したテーブルも作成できます。
定義ファイルを編集する例
$ rails generate model db1 Running via Spring preloader in process **** invoke active_record create db/migrate/**************_create_db1s.rb create app/models/(データベース名).rb invoke test_unit create test/models/(データベース名)_test.rb create test/fixtures/(データベース名)s.yml $ vi db/migrate/**************_create_db1s.rb $ rails db:migrate
モデルを削除する
先ほどRuby on Railsのモデルを作成する際、同時にデータベースのテーブルも作られると説明しましたが、モデルを削除した際も同時にテーブルを削除しなければなりません。
次のモデルの削除とデータベースのテーブル削除手順について紹介します。
モデル削除手順
モデルを削除するには「rails destroy model」コマンドで削除できます。ただし、このコマンドではデータベースのテーブルを削除しないので注意してください。
モデル削除コマンド
rails destroy model モデル名
モデル削除の例
$ rails destroy model db1 Running via Spring preloader in process **** invoke active_record remove db/migrate/**************_create_db1s.rb remove app/models/db1.rb invoke test_unit remove test/models/db1_test.rb remove test/fixtures/db1s.yml
テーブル削除手順
データベース上のテーブルを削除するには、次の手順で転送(migration)処理の設定を作成し、drop_tableコマンドを記述してテーブルを削除します。
$ rails generate migration db1 Running via Spring preloader in process **** invoke active_record create db/migrate/**************_db1.rb $ vi db/migrate/**************_db1.rb class DeleteDb1s < ActiveRecord::Migration[6.1] def change drop_table :db1s *.****s == ************** Db1: migrated (0.2474s) ===================================== $ rails destroy migration db1 Running via Spring preloader in process **** invoke active_record remove db/migrate/**************_db1.rb
まとめ
これまで紹介したようにRuby on Railsを運用する際に必要なデータベースは、デフォルトのSQLiteからMySQLなどに切り替えることが可能です。そしてそのデータベースに格納されたデータは、管理ツールでチェックできます。
ただしモデルとデータベースのテーブルは密接に連携しています。今回紹介した方法を参考にして、必ずRuby on Railsの仕組みを利用してテーブルを作成したり、データを登録してください。