【Sinatraで運動記録アプリ②】ActiveRecordとRakeについて

こんにちは、Mako(@makokamiya)です。
今回は、ActiveRecordとRakeについて調べたこと、実際にSinatraアプリでActiveRecordを使えるように実装したことについてまとめていきます。
ソースコード:https://github.com/mako4kamiya/undouno_kiroku_app
アプリURL :https://undouno-kiroku-app.herokuapp.com/
Active Recordとは
Active Recordとは、MVCで言うところのM、つまりモデルに相当するものである。
アプリケーションのモデルとデータベースを接続してくれて、SQLを直接書かずに保存したり読み出したりできる。
例えばSinatraでActiveRecordなしで、
@users = db.exec_params("SELECT * FROM users")
こう書いていたものが、
@users = User.all
このようにSQL文を書かずに、全てのユーザー情報が取り出せる。
ということは、SQLインジェクションを防ぐことに繋がる。
(悪意のあるユーザーがフォームにSQL文を書くことでデータベースをいじっちゃったりできる)
あと、モデル同士の関連付けや、
(1人のuserが複数のpostsを持ってる等)
データベースに保存する前にバリデーションを行えること、
(新規登録時にすでに同じメールアドレスで登録がないか検証など)
データベースをオブジェクト指向っぽく扱えるなどの特徴があるようです。
(Userっていうオブジェクトの中の、idが1の人を取り出すなど)(だと解釈してる)
Rakeとは
色々なプログラムを、短いコマンドで使えるように、あらかじめ書いておくことができるビルドツール。
例えば、
DBに新しいテーブルを作成する時には、DBクライアントにアクセスして、
CREATE TABLE users (
id SERIAL NOT NULL PRIMARY KEY ,
name VARCHAR( 25 ) NOT NULL ,
password VARCHAR( 60 ) NOT NULL ,
UNIQUE (name)
);
と書かいて作成していたものを、
マイグレーションファイルに「nameとpasswordがあるusersテーブルつくってねー」とあらかじめ書いておいて、
$ rake db:migrate
このコマンドを叩くだけで、テーブルを作ってくれる!
気づいた方もいると思いますが、上記のコマンドはRailsでも使われています。
(Rails5からはrails db:migrate
とコマンドが統一された)
今回はActive Recordにフォーカスしようと思うのでRakeは導入しません!
これからRailsを学習する人、もしくは「Railsやってみたけどちょっと難しかったな」という人は、Sinatra×Active Record×Rakeでアプリを作ってからRailsにいくと、理解が深まるかなと思いました╭( ・ㅂ・)و ̑̑ グッ !
(わたしとしては、何がRakeの機能で、何がActive Recordの機能なのかがわかっただけで今回の記事の大きな収穫でした( • ̀ω•́ )✧
Active Recordを使えるようにする
それでは、SinatraでActive Recordを使えるように実装して行きましょう。
Active Recordの追加
GemfileにSinatra用のgem Active Recordを追加
gem 'sinatra-activerecord'
bundle install
する。
bundler使ってない人は、gem install sinatra-activerecord
して下記を追記。
require "sinatra/activerecord"
Userモデルを作成する
class User < ActiveRecord::Base
end
中身は今は空でおk。
データベース接続の設定
default: &default
adapter: postgresql
encoding: unicode
pool: 5
development:
<<: *default
host: localhost
database: undouno_kiroku_app
password:
DBとusersテーブルの作成
PostgreSQLをインストール後、アクセスする。
(デフォルトでpostgresというデータベースに入る)
$ psql
psql (12.1)
Type "help" for help.
postgres=#
新しいデータベースを作成してアクセスする。
postgres=# CREATE DATABASE undouno_kiroku_app;
CREATE DATABASE
postgres=# \c undouno_kiroku_app
You are now connected to database "undouno_kiroku_app" as user "******".
undouno_kiroku_app=#
usersテーブルを作成する。
undouno_kiroku_app=# CREATE TABLE users (id SERIAL NOT NULL PRIMARY KEY ,name VARCHAR( 25 ) NOT NULL ,password VARCHAR( 60 ) NOT NULL ,UNIQUE (name));
CREATE TABLE
ユーザー新規登録の実装
post '/signup' do
#Active Recordなしだとこう書く。
# name = params[:name]
# password = params[:password]
# db.exec_params("INSERT INTO users (name, password) VALUES ($1, $2)", [name, password])
#ActiveRecordだとこう書ける。
User.create(name: params[:name], password: params[:password]) #バリデーションを行う際にnewメソッドに変えよう。
redirect '/user/index'
end
get '/user/index' do
#Active Recordなしだとこう書く。
# @users = db.exec_params("SELECT * FROM users")
#ActiveRecordだとこう書ける。
@users = User.all
erb :user
end

ユーザー登録ができましたー(´ω`ノノ”☆パチパチ
まとめ
SinatraとRailsの書き方の差分の中で、どれがActiveRecordなのか、そもそもわかってなかったので、いい学びになりました!
Rakeについては存在さえ知らなかった。
Railsは便利すぎて、裏でいろんな奴が頑張ってくれてたんだなーと、改めて実感。
CODEABSEプログラミングスクールを卒業して、これからRailsやるぞーって人で、つまずいた時に参考になればと思います!
最後まで読んでくれてありがとうございました!
コメントや、お待ちしております!
間違った箇所があればコメントで教えていただけると幸いです(๑◔‿◔๑)
ソースコード:https://github.com/mako4kamiya/undouno_kiroku_app
アプリURL :https://undouno-kiroku-app.herokuapp.com/