LoginSignup
3
5

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-05-08

はじめに

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

対象読者

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

本記事の目的

ドットインストールActive Record入門 (全19回)を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ファイルを準備。

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で作成日時と更新日時を自動で設定してみる を参考にした。このブログにも書かれているが、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形式ファイルをカレントディレクトリに作成。

database.yml
development:
  adapter: mysql2
  database: TestApp
  host: localhost
  username: root
  password: ××××××××
  encoding: utf8

このymlファイルを読み込む形でmain.rbを作成。
databaseの読み込みとコンフィグレーションの2行の記述方法に関しては
Sinatra+ActiveRecord+MySQLで、簡単APIサーバ構築 -Qiita
Sinatra+ActiveRecord+SQLite3で,軽量なWeb-DB連携例
を参考にした。

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を使って学びたい初心者の方の一助となれば幸いである。

3
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
5