LoginSignup
0
0

More than 1 year has passed since last update.

#3 SinatraでActiveRecordを使わずに掲示板アプリを作ってみた

Last updated at Posted at 2021-07-30

前回の続き。
前回はモデルを見て行ったので、今回はdatabaseディレクトリ を見ていく!

create_database.sql

ここにデータベースやテーブル作成のSQLを書いてくっぽいけど、どんなコマンドを実行したら
データベースが作られるのかは全く分からない。そこからイメージがついてない。
てか、ここにSQL文書いても、まずデータベースに接続ができるのかが怪しい。
確かにクライアントは定義したけど、別のディレクトリのファイルに定義したから
それをどう連携させるのか。include db.rbとかするわけでもなさそうだし。
一旦、そこは飛ばしてどんなコードか理解していくとする

CREATE DATABASE IF NOT EXISTS 0ch;

まぁこれはそのままで、Ochって名前のデータベースがなければ、
そのデータベースを作るって感じです。
next!

create_post.sql

CREATE TABLE IF NOT EXISTS posts (
  id INTEGER UNSIGNED AUTO_INCREMENT NOT NULL,
  topic_id INTEGER UNSIGNED NOT NULL,
  name VARCHAR(255),
  email VARCHAR(255),
  body TEXT NOT NULL,
  created_at DATETIME NOT NULL,
  PRIMARY KEY (id)
);

IDカラムのデータ型はINTEGERで数値が入っていく

UNSIGNED AUTO_INCREMENT

は、https://kin-memo.hatenablog.com/entry/2018/02/07/182952
この記事にある通りで
UNSIGNEDは、正の数値のみ受け付ける感じ。
AUTO_INCREMENTはその名の通り。
レコードが追加されると、自動的に付与される。今回付与されるのはid
レコードが追加されるたび、idカラムにインクリメントされた数値が追加されていく。

NOT NULLはその名の通り、このカラムには絶対何かしらの値が入っていなきゃいけない。といった制約。

topic_idがなぜあるかというと、
一つのトピックに、いくつもの投稿が紐ずくので、
どのトピックに対する投稿かを識別できるように、
外部キーを設定する必要がある。

https://www.dbonline.jp/mysql/table/index8.html

PRIMARY KEY(主キー)とは作成したテーブルの中の1つまたは複数のカラムの組み合わせに対して設定するもので、テーブルに格納されているデータをに格納されているデータを識別するための目印のようなものです。

まぁ確かにプライマリーキーがあれば、id=3でそのデータが参照できるってわけか。
プライマリーキーに指定したカラムは重複とNULLを受け付けないようになる。
受け付けたら識別できなくなるからね

てか、railsで開発してた頃は、プライマリキーを指定した覚えなんてないんだが、、
それなのに困ったことなかった。。。。なんでやねん。。。
sinatraとrailsを行き来すれば、理解深まりそうと思った。
railsの仕組みについても興味が湧いてきますね。

create_topics.sql

CREATE TABLE IF NOT EXISTS topics (
  id INTEGER UNSIGNED AUTO_INCREMENT NOT NULL,
  title VARCHAR(255) NOT NULL,
  created_at DATETIME NOT NULL,
  updated_at DATETIME NOT NULL,
  PRIMARY KEY (id)
);

まぁ、さっき解説した通りですね〜。

app.rb

ついでにapp.rbも見ておきましょう。


require 'sinatra'
require 'slim'

require_relative 'models/topic'
require_relative 'models/post'

get '/' do
  @topics = Topic.all
  slim :index
end

post '/topics' do
  topic = Topic.new(title: params[:title])
  topic.save
  redirect '/'
end

get '/topics/:id' do
  @topic = Topic.find(params[:id])
  @posts = Post.of_topic(@topic.id)
  slim :show
end

post '/topics/:topic_id/posts' do
  name = params[:name].empty? ? '名無し' : params[:name]
  post = Post.new(name: name, email: params[:email], body: params[:body], topic_id: params[:topic_id])
  post.save
  redirect back
end

なんだかroutes.rbみたい

まぁ、なんとなくわかるので、大丈夫でしょう。

次回はいよいよ、アプリを実行していきたいと思います。
コードを書いたはいいけど、何のコマンドを打てば
データベース作られたりするのかがいまいちよく分からないですね。

#4はこちら

0
0
1

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
0
0