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

【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/