ドットインストールのActiveRecord教材をMySQLで始めたい

# はじめに
本記事は[ドットインストールActive Record入門 (全19回)](http://dotinstall.com/lessons/basic_activerecord_v2)で学習する内容をMySQLを用いて再現した時のメモ書きである。（ドットインストールではSQLite3を用いていた）
そのため、SQLite3とMYSQLの実装時における差分を中心に掲載。

#対象読者
ActiveRecordを勉強しようと思い、ドットインストールの該当教材を開くも、MySQLでなくSQLite3での実装だったため、ちょっとがっかりしてしまった人（どんだけ母数少ないんや）

#本記事の目的
[ドットインストールActive Record入門 (全19回)](http://dotinstall.com/lessons/basic_activerecord_v2)をMySQLを使っても履修し始められるソースコードと情報の提供


#実行環境

|        |   バージョン  |   Extra     |
|:-----------------:|------------------:|:------------------:|
|CentOS|6.9|VirtualBox経由でssh接続|
|VirtualBox|5.1.18||
| ActiveRecord             |     5.1.0          |                |
| MySQL           |    5.7.18         |              |
|     Ruby         |            2.4.1 |        rbenvで管理        |
| Bundler                |         1.14.6        |             |
 
#Gemfileの作成とインストール
Bundlerを用いたgemのバージョン管理の練習もしたかったため、使用するgemファイルを管理するファイルをカレントディレクトリに作る。

```
\# ひな形ファイルの作成
$ bundle init
Writing new Gemfile to /home/u1/hoge/Gemfile

\# 編集
$ vim Gemfile
source "https://rubygems.org"

gem "activerecord"
gem "mysql2"
gem "sinatra"

\# 必要なGemのインストール
$ bundle install --path vendor/bundle
```

#データベースの準備
ドットインストールでは第2回の内容に相当。
インポートするsqlファイルを準備。

```sql:import.sql
create database if not exists TestApp;
use TestApp;

create table users(
 id         int(5) primary key auto_increment,
 name       varchar(50),
 age        int(5),
 created_at timestamp not null default current_timestamp,
 updated_at timestamp not null default current_timestamp on update current_timestamp
)
auto_increment = 1;
```
###MySQLと SQLite3の相違点
 - 自分で調べた限りによると、MySQLではcreated_atとupdated_atは自動でデータ型が適用されず、以上のように設定する必要があるらしい。この設定は
[MySQL5.6で作成日時と更新日時を自動で設定してみる](http://d.hatena.ne.jp/yk5656/20141204/1426176800)
を参考にした。このブログにも書かれているが、MySQLのバージョンが古いと、

```
ERROR 1293 (HY000): Incorrect table definition; there can be only one TIMESTAMP column with CURRENT_TIMESTAMP in DEFAULT or ON UPDATE clause
```

というエラーが出る。

-  auto_incrementもデフォルトでは設定されないので、設定する必要がある。もしくは、データをinsertする際にidも追加で付与するか。


#レコードの挿入
ドットインストールでは第3、4回の内容に相当。

後々の便利のために、データベースに関する設定情報を「database.yml」という名前のYAML形式ファイルをカレントディレクトリに作成。

```yaml:database.yml
development:
  adapter: mysql2
  database: TestApp
  host: localhost
  username: root
  password: ××××××××
  encoding: utf8
```
このymlファイルを読み込む形でmain.rbを作成。
databaseの読み込みとコンフィグレーションの２行の記述方法に関しては
[Sinatra+ActiveRecord+MySQLで、簡単APIサーバ構築 -Qiita](http://qiita.com/u1_fukui/items/88c10d4d530ec6fbaaa1)
[Sinatra＋ActiveRecord＋SQLite3で，軽量なWeb-DB連携例](https://tamosblog.wordpress.com/2012/10/26/sinatra/)
を参考にした。

```rb:main.rb
require 'active_record'
require 'pp'
require 'mysql2'

Time.zone_default = Time.find_zone! 'Tokyo'
ActiveRecord::Base.default_timezone = :local

ActiveRecord::Base.configurations = YAML.load_file('database.yml')
ActiveRecord::Base.establish_connection(ActiveRecord::Base.configurations['development'])

class User < ActiveRecord::Base
end

# insert

user = User.new
user.name = "tanaka"
user.age = 23
user.save

# user = User.new(:name => "hayashi", :age => 25)
user = User.new(name: "hayashi", age: 25)
user.save

User.create(name: "hoshi", age: 22)
```

このmain.rbを、

```
bundle exec ruby main.rb
```
で実行すると、エラーなく通った。
MySQLで

```
use TestApp;
select * from users;
```
を打って確認すると、

```
+----+---------+------+---------------------+---------------------+
| id | name    | age  | created_at          | updated_at          |
+----+---------+------+---------------------+---------------------+
|  1 | tanaka  |   23 | 2017-05-08 14:11:00 | 2017-05-08 14:11:00 |
|  2 | hayashi |   25 | 2017-05-08 14:11:00 | 2017-05-08 14:11:00 |
|  3 | hoshi   |   22 | 2017-05-08 14:11:00 | 2017-05-08 14:11:00 |
+----+---------+------+---------------------+---------------------+
3 rows in set (0.00 sec)
```
と正しくレコードが挿入されていることがわかる。ちなみにここで、

```
update users set name = 'toyama' where id = 1;
```
と、あるレコードの値を更新してみると、

```
mysql> select * from users;
+----+---------+------+---------------------+---------------------+
| id | name    | age  | created_at          | updated_at          |
+----+---------+------+---------------------+---------------------+
|  1 | toyama  |   23 | 2017-05-08 14:11:00 | 2017-05-08 14:39:55 |
|  2 | hayashi |   25 | 2017-05-08 14:11:00 | 2017-05-08 14:11:00 |
|  3 | hoshi   |   22 | 2017-05-08 14:11:00 | 2017-05-08 14:11:00 |
+----+---------+------+---------------------+---------------------+
3 rows in set (0.00 sec)
```
となり、created_atもupdated_atも正しく機能していることがわかる。

これ以降の教材動画は、MySQLでもSQLite3でも全く操作は変わらない。


#終わりに
せっかく良い教材なので、MySQLを使って学びたい初心者の方の一助となれば幸いである。