概要
モデルによるデータベース操作を、できるだけ基本的な方法で行うことを試した。
またテーブル構造の変更に対して、マイグレーションを行わずにmysqlコンソールとコントロールファイル編集だけで対応できることを確認した。
モデルとテーブルの生成
モデルの生成
以下の様にモデルを生成する。このモデルは文字列型のフィールドを1つ持っている。
rails generate model record col1:string
1 2 3 4 5 6 7 8 |
[vagrant@localhost migrate]$ rails generate model record col1:string Running via Spring preloader in process 24431 invoke active_record create db/migrate/20210308054636_create_records.rb create app/models/record.rb invoke test_unit create test/models/record_test.rb create test/fixtures/records.yml |
app/models/record.rbが作成される。
1 2 |
class Record < ApplicationRecord end |
マイグレーションファイルも作成されていて、string型のフィールドが定義されている。
1 2 3 4 5 6 7 8 9 10 |
[vagrant@localhost demo_app]$ cat db/migrate/20210308054636_create_records.rb class CreateRecords < ActiveRecord::Migration[6.1] def change create_table :records do |t| t.string :col1 t.timestamps end end end |
マイグレーション~テーブル生成
このモデルからマイグレーションによりテーブルを生成する。
rails db:migrate
1 2 3 4 5 |
[vagrant@localhost migrate]$ rails db:migrate == 20210308054636 CreateRecords: migrating ==================================== -- create_table(:records) -> 0.0364s == 20210308054636 CreateRecords: migrated (0.0365s) =========================== |
mysqlでテーブルが生成されていることと、そのテーブルの構造が確認できる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
mysql> show tables; +-----------------------+ | Tables_in_demo_app_db | +-----------------------+ | ar_internal_metadata | | records | | schema_migrations | +-----------------------+ 3 rows in set (0.00 sec) mysql> desc records; +------------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +------------+--------------+------+-----+---------+----------------+ | id | bigint | NO | PRI | NULL | auto_increment | | col1 | varchar(255) | YES | | NULL | | | created_at | datetime(6) | NO | | NULL | | | updated_at | datetime(6) | NO | | NULL | | +------------+--------------+------+-----+---------+----------------+ 4 rows in set (0.00 sec) |
モデルの構造の確認
コントローラーからモデルの内容を出力させる。
1 2 3 4 5 6 7 |
class DemoContentsController < ApplicationController def top_page puts "EXAMPLE" record = Record.new p record end end |
トップページを出力させると、サーバー実行中のコンソールに以下が出力される。
1 2 3 4 5 6 |
app/controllers/demo_contents_controller.rb:4:in `top_page' Started GET "/" for 10.0.2.2 at 2021-03-** **:**:** +0900 Cannot render console from 10.0.2.2! Allowed networks: 127.0.0.0/127.255.255.255, ::1 Processing by DemoContentsController#top_page as HTML EXAMPLE #<Record id: nil, col1: nil, created_at: nil, updated_at: nil> |
Railsデフォルトのid、created_at、updated_atに加えてcol1が要素に加わっている。
データの登録確認
トップページアクセス時にレコードを1つ登録する。レコードのフィールドはハッシュで指定する。
1 2 3 4 5 6 7 8 |
lass DemoContentsController < ApplicationController def top_page puts "EXAMPLE" record = Record.new({col1: 'abc'}) p record record.save end end |
Railsサーバーのコンソールに以下が出力され、データが生成・登録されていることがわかる。
1 2 3 4 5 6 7 8 9 10 11 |
app/controllers/demo_contents_controller.rb:6:in `top_page' Started GET "/" for 10.0.2.2 at 2021-03-** **:**:** +0900 Cannot render console from 10.0.2.2! Allowed networks: 127.0.0.0/127.255.255.255, ::1 Processing by DemoContentsController#top_page as HTML EXAMPLE #<Record id: nil, col1: "abc", created_at: nil, updated_at: nil> TRANSACTION (2.7ms) BEGIN ↳ app/controllers/demo_contents_controller.rb:6:in `top_page' Record Create (2.4ms) INSERT INTO `records` (`col1`, `created_at`, `updated_at`) VALUES ('abc', '2021-03-** **:**:**.501886', '2021-03-** **:**:**.501886') ↳ app/controllers/demo_contents_controller.rb:6:in `top_page' TRANSACTION (9.4ms) COMMIT |
mysqlでもテーブルへの登録状況が確認できる。
1 2 3 4 5 6 7 |
mysql> SELECT * FROM records; +----+------+----------------------------+----------------------------+ | id | col1 | created_at | updated_at | +----+------+----------------------------+----------------------------+ | 1 | abc | 2021-03-** **:**:**.501886 | 2021-03-** **:**:**.501886 | +----+------+----------------------------+----------------------------+ 1 row in set (0.00 sec) |
データの読み込み確認
トップページ読み込み時にデータベースを読み込んで表示するように変更する。
1 2 3 4 5 6 7 |
class DemoContentsController < ApplicationController def top_page puts "EXAMPLE" records = Record.all p records end end |
出力は以下のとおりで、データベースの内容が読みだされている。
1 2 3 4 5 6 |
app/controllers/demo_contents_controller.rb:5:in `top_page' ..... EXAMPLE Record Load (2.0ms) SELECT `records`.* FROM `records` /* loading for inspect */ LIMIT 11 ↳ app/controllers/demo_contents_controller.rb:5:in `p' #<ActiveRecord::Relation [#<Record id: 1, col1: "abc", created_at: "2021-03-** **:**:**.501886000 +0000", updated_at: "2021-03-** **:**:**.501886000 +0000">]> |
MySQLでのテーブル変更
以下の様にmysqlで直接テーブルにフィールドを加える。
1 2 3 4 5 6 7 8 9 10 11 |
mysql> ALTER TABLE records ADD col2 INT; Query OK, 0 rows affected (0.03 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> SELECT * FROM records; +----+------+----------------------------+----------------------------+------+ | id | col1 | created_at | updated_at | col2 | +----+------+----------------------------+----------------------------+------+ | 1 | abc | 2021-03-** **:**:**.501886 | 2021-03-** **:**:**.501886 | NULL | +----+------+----------------------------+----------------------------+------+ 1 row in set (0.00 sec) |
Railsで変更後テーブルへの書き込み
トップページアクセス時に、フィールド追加後のテーブルに新たなデータを書き込むように変更。
1 2 3 4 5 6 7 8 |
class DemoContentsController < ApplicationController def top_page puts "EXAMPLE" record = Record.new({col1: 'ABC', col2: 123}) p record record.save end end |
トップページ表示時にデータが登録され、テーブルは以下の様に更新されている。
1 2 3 4 5 6 7 8 |
mysql> SELECT * FROM records; +----+------+----------------------------+----------------------------+------+ | id | col1 | created_at | updated_at | col2 | +----+------+----------------------------+----------------------------+------+ | 1 | abc | 2021-03-** **:**:**.501886 | 2021-03-** **:**:**.501886 | NULL | | 2 | ABC | 2021-03-** **:**:**.219484 | 2021-03-** **:**:**.219484 | 123 | +----+------+----------------------------+----------------------------+------+ 2 rows in set (0.00 sec) |