【今日のアウトプット】SQLの基礎学習

SQLの基礎構文を学習したので、アウトプットしていきます。

SQLとは

Structured Query Language の略で、RDB(リレーショナルデータベース)に命令する言語。
命令(Query)は大きく3種類ある。

  • データ定義(DDL)Definition
  • データ操作(DML)Manipulation
  • データ制御(DCL)Controll

基本の4つ

データ取得

SELECT カラム名
FROM テーブル名

カラム名を * とすると、すべてのデータを取得する。

データ追加

INSERT INTO テーブル名 VALUES(1, "きょろ", 23, "2020-11-30")

カラム名は省略して、データの値だけ書いている。
データの値が抜けいてると、nullとなる。

※ ちなみにデータの追加ではなく、カラムを追加したい場合

ALTER TABLE テーブル名  (カラム名 カラムの型)

データ更新

UPDATE テーブル名
SET カラム名 = カラムの値


※ ちなみにデータの更新ではなく、カラムを更新したい場合

ALTER TABLE テーブル名 CHANGE 旧カラム名 新カラム名 新カラムの型

データ削除

DELETE FROM テーブル名
WHERE id = 1  ←条件文(指定したレコードを削除する)


※ ちなみにデータの削除ではなく、カラムを削除したい場合

ALTER TABLE カラム名 DROP データの値

基本構文

WHERE

条件文をつけてデータを取得する。

「=」で完全一致のデータを取得
「LIKE」で部分一致のデータを取得
WHERE カラム名 LIKE "%〇〇%"

WHERE カラム名 LIKE "〇〇%"  ←前方一致

WHERE カラム名 LIKE "%〇〇"  ←後方一致
NOT演算子

「〇〇を含まないデータ」「〇〇に一致しないデータ」「〇〇以外のデータ」を取得したい時に使う。 ※WHEREと併用して使う

IS NULL
WHERE カラム名 IS NULL 

とすることで、カラムが空のデータを取得する。
逆に、カラムが空でないデータを取得するには、

WHERE カラム名 IS NOT NULL
BETWEEN演算子

範囲の条件を指定する。

WHERE age BETWEEN 20 AND 25

年齢20歳から25歳で範囲を指定してデータを取得している。

IN演算子

指定のカラムの値に、指定のデータの値があるデータを取得する。

WHERE カラム名 IN ("鈴木", "田中", "佐藤")
AND / OR

条件が複数ある時にWHEREと併用して使う。

ORDER BY

データの並び替えをする。

ORDER BY カラム名 DESC(ASC)

DESC(降順) / ASC(昇順)

LIMIT

データの取得件数を指定する。

SELECT created_at
FROM users
WHERE created_at <= "2020-09-01" ORDER BY DESC
LIMIT 5202091日以前に作成されたデータの中でも最新の5件を取得

※クエリの末尾に記述する

DISTINCT

重複データを除いて取得する。

SELECT DISTINCT カラム名
FROM テーブル名
SUM関数

指定したカラムのデータ合計を取得する。

SELECT SUM(price)
FROM purchases
AVG関数

指定したカラムのデータの平均値を取得する。

SELECT AVG(age)
FROM users
COUNT関数

指定したカラムのデータの数を数える。

SELECT COUNT(name)
FROM users

※NULLのデータはカウントされない
NULLも含めたレコードの数を数えたい時は、

COUNT(*)
MAX / MIN

指定したカラムのデータの最大・最小の値を一発で取得する。

MAX カラム名
MIN カラム名

JOIN ON

テーブルデータを連結させる。

SELECT *
FROM テーブルA
JOIN テーブルB 
ON テーブルA.id = テーブルB.id   ←(結合条件: 外部キー = 主キー)

※実行の順番は、先にテーブルを結合してからSELECT*を取得する
※JOINは外部キーがNULLのレコードは取得しない。
NULLのレコードも実行結果に表示したいときは、LEFT JOIN ON を使う。

GROUP BY

グループ化をして、指定したデータごとにまとめる。

GROUP BY カラム名

※GROUP BYを使うとき、SELECTで使えるのは、GROUP BYで指定したカラム名と、集計関数のみ ※WHERE文より後に記述する

HAVING

グループ化したデータに条件をつけて、さらに絞り込む。

HAVING created_at <= "2020-08-31"

WHERE文との違いは、GROUP BYの先に読み込まれるか、後に読み込まれるか。
つまり、WHEREの対象はテーブル全体、HAVINGの対象はグループ化されたデータとなる。

読み込み順

WHERE(テーブル対象の条件検索) ↓ GROUP BY(グループ化) ↓ SUM, COUNT, AVG, などの集計関数 ↓ HAVING(グループ化対象の条件検索)

終わりに

今回は 文末に ; を付けないことで統一しましたが、Sequel PrpでSQLを書く以外、基本的には 文末に ; が必要となるので注意。 実際にSQLに触れながら学習したことで、基礎的な操作はできるようになった。実際はテーブルの数もデータの数もSQLの記述自体ももっと増えていくと思うので、どんどん知識の幅を広げていかないといけないなと。

【今日のアウトプット】PHPの基礎学習

MAMPをインストールして、ローカル環境でPHPを使える準備とWordPressについて簡単に学習しました。
PHPWordPressをカスタムできるようになりたいので、まずはPHP学習を進めていこうという結論に至りました。

クラスとインスタンス

このあたりの概念はRubyと同じなのでサクッと。

<?php
  class User{
  }

  $user1 = new User(); //←インスタンスの生成
  $user2 = new User();
  $user3 = new User();
?>

注意点は、インスタンスの生成はクラスの外であること。

プロパティとメソッド

プロパティとは、実体を持つインスタンスのデータや値のこと。
例)name , age , price , color など
基本的には、

private $name;

と定義する。プロパティの呼び出しは、

$kyoro->name = 'KYORO';


メソッドとは、処理(関数)のこと。
例)getName , getTotalPrice など

<?php
public function getName(){
  echo "私の名前は{$name}です";
}
?>

と定義する。メソッドの呼び出しは、

<?php
$name->getName();
?.


$this

メソッド内でインスタンスのプロパティやメソッドにアクセスしたい時に使う。
$thisはクラス内のメソッドの中でのみ使える

__construct メソッド

メソッドを定義する際に、__constructを付けておくと、インスタンスを生成したと同時にそのメソッドが呼び出されるようになる。
Rubyのinitializeメソッドっぽいイメージ)
これらを踏まえて記述すると、

<?php
  class User{
    private $name;
    private $age;
    
    public function __construct($name, $age) {
      $this->name = $name;
      $this->age = $age;
    }
    
    public function getName() {
      return $this->name;
    }
    public function getAge() {
      return $this->age;
    }
  }

  $user1 = new User($name, $age); //←インスタンスの生成
  $user2 = new User($name, $age);
  $user3 = new User($name, $age);
?>
require_once
<?php
   require_once('ファイル名.php');
?>

とすることで、別のphpファイルを読み込むことができ、そこで定義されているクラスや変数を使うことができる。

画像の表示

HTMLタグの中にPHPを埋め込んで画像を表示する。

<?php
<img src="<?php echo $user->image ?>">
?>

しかし、$imageというプロパティは基本的にprivateで定義されているため、クラスにおいて以下の処理が必要。

<?php
  class User{
    private $image;
    
    public function __construct($image) {
      $this-> = $image;
    }
    
    public function getImage() {
    return $this->image;
    }
  }

  $user1 = new User($image); //←インスタンスの生成
?>
<?php
<img src="<?php echo $user->getImage() ?>">
?>

となる。

カプセル化

カプセル化とは、触れてほしくない値に関して敢えて隠すことで、使える機能を制限すること。 それは知らなくてもいいことだよってことかな(?)

上述のように基本的に、プロパティではprivate、メソッドではpublicでそれぞれ定義しています。

しかし、アクセス権をprivateにすると、プロパティの値をクラスから取り出したり、値を変更したりすることができなくなる。
これを解決するために、メソッドを作る。

プロパティを返すためだけのメソッド「ゲッター」を定義する

これが先程の、

<?php
public function getImage() {
    return $this->image;
    }
?>

getImageというメソッドで$imageプロパティの値をreturnしている。

プロパティの値を変更(セット)するメソッド「セッター」を定義する

たとえば個数をカウントするとき、クラスで$countNumというプロパティを定義し、初期値を0にする。
引数にクラス外からの値を受け取り、プロパティにその数を代入する。

<?php
  class User{
    private $countNum = 0;

  public function setCountNum($countNum){
    $this->countNum = $countNum;
  }
?>

終わりに

なるほど、少しややこしくなってきた。記述方法にしても、基礎の部分やっただけでRubyがいかにシンプルだったか分かる笑
カプセル化は学習が進むとより重要性増してきそうな気がするから、今日はこのゲッターとセッターについて抑えておけばオッケーてことにしとこう。

【今日のアウトプット】PHPの基礎学習はじめました。

バックエンドのプログラミング言語としてはRubyをこれまで学習してきました。Rubyオブジェクト指向やWeb向けという共通点を持つ、よりメジャーな言語であるPHPの学習を始めたので、今日学んだ基礎の部分をアウトプットしていこうと思います。

PHPの特徴

PHP(Personal Home Page Tools)
  • Webに特化した言語である。(WebサービスやWebアプリ)
  • WordPressをカスタマイズ、テーマの作成ができる
  • データベースに接続して、データの登録・取得・削除ができる

はじめに

まず学習を始めた段階として、Rubyと違って気をつけないといけないと感じた点は、
  • 変数名や配列名の頭に$をつけるということ
  • 末尾に;をつけるということ
  • 配列が[]じゃなかったりする
  • Rubyのようなルーティングと違ってファイルでページ遷移をつくる?ということ
  • 拡張子.phpのファイルは極論HTMLのみで記述できるということ

基本文法

配列

$name = array(a, b, c);

配列に要素を追加するときは、

$name[] = 'd';

配列の要素を上書きするときは、

$name[0] = 'A';


連想配列
Rubyでいうハッシュみたいなもので、キーバリューセットを配列で管理したもの。

$user = array('name' => 'きょろ', 'age' => 23, 'height' => 172);

値の取り出し(キーを指定する)
このときは ( ) ではなく[ ] で、キーを ' ' で囲うことに注意!

echo $user['name'];

値の追加

$user['gender'] = 'men';

for文(繰り返し)

for ($i = 1; $i <= 100; $i++){
    echo $i;
}

注意点は、条件文の()内の区切りは、, ではなく ; であること。 解説をすると、

for (初期値; 条件; 変数の更新){
    繰り返す処理;
}

変数の更新について、$i が1づつ増えていく場合の省略形として、$i++ と書ける。

while文(繰り返し)

for文と違って、変数の更新が条件分に含まれないため、自動的に$Iが増えていくことはないが、whileの条件式が満たされるまで繰り返しが続くので、無限ループに注意する。

$i = 1;  //初期値設定
while ($i <= 100){
    echo $i;
    $i++;  //←これがないと無限ループになる
}

berak; で完全にループを抜ける
continue; でその周だけスキップする(次のループは実行される)

foreach文(配列または連想配列に対して繰り返し処理をする)

$towns = array('東京', '大阪', '福岡');

foreach ($towns as $town){
    echo $town.' ';
}

//出力結果    東京 大阪 福岡 //← .' ' によって都市名の間に半角スペースがある

Rubyではdo~endとブロック変数を使って処理を書いていたけど、PHPでは as を使う。 また、. で変数や文字列などを繋げることができる。

PHPの関数

今日学習した簡単なデフォルト関数

  • strlen(文字列の文字数を返す)
  • count(配列の要素の数を返す)
  • rand(ランダムな整数を返す:例えば、echo rand(1, 5)とすると1~5のランダムな整数を返す)

自分で関数を定義する

記述方法としてはJavaScriptに似ている。

function hello(){
    echo 'Hello World';
}

hello();  //←関数の呼び出し

ちなみに、関数名が2語以上のときは、キャメル型で書くようにする。
関数の戻り値をreturnで返す。

終わりに

満を持してPHPの学習はじめました。良くも悪くもRubyに似てるから、細かいところの記述に注意して慣れていかないとごっちゃになりそうです。考え方についてはまだ触れられてないので分からないけど、基本構文に関しては、理解がしやすいなと思いました。新しいこと学び始めるとワクワクして面白いです。

【雑記】オリジナルアプリケーションについて語る

オリジナルアプリについて語らせてください。

 

Rebom「読書で人生を豊かにする」

リボンと読みます。 ( Read Book Management の略)

 

本を読んで得た学びや気づきを記録していくアプリケーションを作成しました。


200字以内で手軽にメモ感覚で書いて投稿することができ、自分だけの読書ノートを作れるアプリケーションです。


ちょっとした学びや体験をちょっとずつ記録していくことで、一冊の本を読み終えたときには、その本から抽出された自分だけの読書ノートが出来上がります。


いつでも見返すことができ、本から学んだことや感じたことを体系的に振り返ることができるため、思考の整理や脳への定着度を高めることができます。
また、自分はどんな文章や言葉から何を感じたのかといった、自分の思考を客観的に見ることができます。

 

想定している本は、ビジネス本や自己啓発本、エッセイなどの文芸などです。

 

制作背景

「この言葉好きだな」「この考え方なんか良いな」「なるほど!」


本を読んでいると、こういった学びや感情の動きがあります。

しかし、本を読み終えたときにはほとんど忘れていて、そのときの瞬間的な経験で終わってしまっていることが多いということがよくありました。

 

せっかく良い本を読んで、良い学びがあったはずなのに、なんとなく読んだことに満足してしまって、また次の本を読み始めるということを繰り返していました。


読書はコスパ最強の自己投資とよく言われていますが、ただ買って読むだけで自己投資になっているでしょうか。


「本を読み終えた後、学んだことや新たな発見をどう実生活と結びつけたらいいのかわからない」

「思考を整理できてないまま放置している」

 

といった、なんとなく状態が根本的な要因となり、読書を習慣的に行なうことや自己投資として活用することができていないという課題を抱えている人は多いと考えました。

  

ただ、一冊の本を読み切るにはかなりエネルギーが必要ですし、読了が目的になってしまいがちです。

また、読み終えた後ではかなり内容が抜け落ちていて、思考を整理しようとしても難しいと思います。

 


そこで、少しづつ読み進めながら細かくアウトプットできるアプリケーションがあったら良いなと考えました。


本を読んで得たことを元に、日々の生活や仕事に落とし込む具体的なアクションプランまで考えることをサポートするアプリケーションにしたいと思いました。

 

「誰の」どんな「課題」を「どうやって」解決?

読書を瞬間的な疑似体験としてだけでなく、生活や仕事に活かせる永続的な学びとして活用したいと考えている人物

の 

  • 読書を習慣化したいが、モチベーションが続かない
  • 本を読んでもすぐに内容を忘れてしまい、人生に活かすことができていない
  • 様々な本の中に点在する学びや気づきの内容が頭の中で整理できない

 

という課題を

 

  • 200文字以内でアウトプットすることが前提で、章単位やセクション単位で少しづつ記録していくことができる投稿機能
  • 気になる本だけを集めることができる、お気に入り機能
  • 本ごとに情報をまとめることができ、必要な箇所を読み終えたら出品できる機能

 

といった機能によって解決します。

 

特徴・メリット

  • 本ごとに情報を整理することができ、後から見返しやすい
  • 他ユーザーの投稿もみることができるので、他の人はこの本を読んでどんなことを感じたのか、どんなことを学んだのかといった他人の視点で本と向き合うという付加価値がある
  • タイムライン上にユーザーが追加した本が表示されるので、本との出会いの機会が増えたり、気になる本が増えたりして、モチベーションを維持しやすくなる
  • 気になる本が出品されていれば、アプリ上で購入することも可能
  • 読み終えた本の記録はアプリ上に残したまま、本自体はアプリ上で出品することも可能(紙の本の良さは読んだら売れる、という利点を活かせる)

 

 こだわったところ

ユーザー同士の繋がり度合い

最大のこだわりは、ユーザー同士の繋がりを活発にしすぎないという点です。

Rebomは、本の紹介アプリではなく、あくまでも自分の人生を豊かにするために自分と向き合う時間のツールとして使ってもらいたいという想いがあるため、コメント機能やフォロー機能はあえて実装していません。

他ユーザーからのコメントや誰にフォローされたなどといった、外部からのアクションに気を取られないようにしています。

その代わり、お気に入り登録数を数値で見ることや、他ユーザーはどんなアウトプットをしているのかを見ることができるといった機能によって、控えめ且つポジティブな交流のみ生まれるようにしました。


(ただ、本の売買機能についてはメッセージでのやり取りが必要になる場合もあると考えているため、今後検討していこうと思っています。)

 

シンプルで使いやすい見た目と機能

手軽にアウトプットすることを重視しているため、シンプルな見た目と機能で使いやすさを意識しました。具体的には、

  • リンク上にカーソルを置くとポインターになるため、クリックする位置がわかりやすい
  • ボタンの重要度によって配色や大きさ、カーソルを置いたときの変化をつけた点
  • 読書の刺激にならないような落ち着いた配色を意識
  • ユーザー情報編集においてパスワードの変更は頻度が低いため、必要な時だけ変更できるようにしている点

 

お気に入り登録

お気に入りをすることによって、相手にリアクションを送るだけでなく、自分だけのお気に入りリストが勝手に出来上がっていくようにしたことです。

もちろん自分の追加した本にお気に入りすることもでき、お気に入りページにお気に入りした本だけを一覧表示できるようにしました。

 

終わりに

自分がいちばん使いたいと思えるようなアプリケーションを作ることができました。ただ、実際に初めて使うユーザーの意見ほしいなと思ったので、友人何人かにお願いしてレビュアーになってもらいました。そういった意見も取り入れつつより良いアプリケーションにしていきたいと思うくらい愛着湧いてます。

似たような内容になってますが、より詳しいRebomについてのREADMEよかったら見てください。

github.com

【RSpec】結合テストコードでプルダウンから選択する処理をする方法

オリジナルアプリの結合テストコードを書いていた時に、Activehashを使って実装したプルダウンの選択式フォームをテストコードでどうやって表現したらいいんだ?ってなったので、その方法を書きます。 Activehashを使った実装でなくても、selectタグとoptionタグでプルダウン選択の実装はできるので、テストコードも同じになるかと思います。

僕が最初にやろうとしたこと

  1. まずプルダウンを展開させるためにクリック
find('.select-box').click

2. 適当な値を選択してクリック しようとしたけど...あれ? name属性が無い。valueしかない。
Image from Gyazo
一応valueの値、文字列、親要素のname属性とかで指定したりしてみたけど、エラー。

考えたこと

そもそも、このフォームの値として送信されるのは選択した文字列ではなくて選択番号だということ。
だからクリックするユーザーアクションとしては正しいけど、処理としてはclick_onやfind().clickを使うのは適切ではない気がする。

自分の知識の範囲では答えが出そうになかったので調べたらすぐ解決できた

1 . まずプルダウンを展開させるためにクリック

find('.select-box').click

ここは一緒。

2 . プルダウンメニューから選択する場合、Capybaraで要素を選択するには以下のように書く。

select '新品', from: 'item-sales-status'

ここでは適当に'新品'を選択することにします。
構文としては

select '文字列(ラベル)', from: '親要素プルダウンメニューのid'

知っていれば何のことはないですね。勉強になりました。

終わりに

これから基礎の復習をしていきたいと思っているので、基礎的な内容をこまめにアウトプットしていけるように頑張っていきたいと思います。それと、自分のオリジナルアプリ語りもしたいところですな。

【Docker入門】

Dockerの学習を始めたので、基礎的なところを少しアウトプットしていきます。

 

Dockerとは

コンテナという環境のパッケージ化をする環境仮想化技術のこと。コンテナの作成、実行、配布が簡単に行うことができる。

 

Docerの特徴

  • コンテナ型
  • 配布が簡単

コンテナ型は、ホストOS上に直接存在し、それぞれのプロセスごとのゲストOSを必要としない。

ホストOS内のカーネルという技術を使って実現している。つまり、ゲストOSが無く、処理の層もシンプルになる(オーバーヘッドが少ない)ため、処理・起動が速いというメリットがある。また、Dockerfileを用いてインフラのコード化が可能なため、可搬性が高く、非常に使い勝手が良い。一応、コンテナ型のデメリットとしてはホストOSと異なるOSは動かせないという点。

 

配布が簡単というのは、DockerHubというプラットフォームを使うことによって可能となる。Dockerは環境設定をコード化することができ、DockerHubを使って自分の設定ファイルを世界中の人に配布できたり、世界中の人の環境設定をすぐに自分の環境として作成することができる。

 

 

Dockerのコンテナの仕組み

コンテナはホストOSのカーネルという機能を利用した技術で、cgroup・namespace・Capabilityという技術を組み合わせて実現している。

 

cgroup(controll group)

コンテナが利用するメモリ・CPUなどのリソースの割当てと管理(制限)をしている。割り当てられたリソースを消費しても他のコンテナに影響を与えないように調整してくれている。

namespace

プロセスやネットワーク、アクセスなどそれぞれに関してnamespaceごとに隔離をしている。これも、コンテナごとを隔離して、それぞれ独立的にファイル構造やプロセス空間を持たせる役割を持つ。

 

Capability

DockerコンテナへホストOSのrootユーザーの権限を制限し、最小限の権限を付与・管理を行なう。 

 

Dockerの使われ方

組織やチームで開発するときに開発環境の作成と共有が簡単にできる。

開発環境と同じ環境をそのまま本番環境でも使うことができる。

環境設定をコード化して、パッケージ化したものを簡単に配布できる。

 

Docker Image

CentOSUbuntuなどのOS、NginxやMySQLなどのソフトウェア、RubyPHPなどの言語といった特定の環境を提供してくれるため、Imageを起動することで環境を再現することができる。docker pullコマンドで、DockerHubから様々なDocker Imageを取得することができる。

Dockerfile

必要なパッケージやアプリなど各種設定を自らコード化し、記述したファイルのこと。Docker ImageはこのDockerfileに基づいて作成されるため、自分に合った環境設定(Docker Image)を作成できる。

このDockerfileからベースイメージを使用してDocker Imageを作成することをビルドという。また、既に起動されたDockerコンテナからDocker Imageとして作成することをコミットという。

 

終わりに

入門のところで大事そうなところを簡単にまとめてみました。初めは言葉やカタカナの意味が難しくて、今もなんとなくの理解しかできていませんが、仕組みや概念が少しわかってきました。これをアプリにどう取り入れて使うのかまではまだよく分かっていないのでこれからも学習を進めて理解を深めていきたいと思います。

 

【Rails基礎】データの保存、更新、削除

はじめに

Webアプリケーションを開発する上での基本となるCRUD
新規作成(Create)、表示(Read)、更新(Update)、削除(Destroy)それぞれの頭文字を取ってCRUDと呼ばれている。

今回はrailsでのデータの保存(新規作成)、更新、削除についてまとめる。
最後にデータベースにカラムを追加する方法についても記述する。

データの保存(新規作成)

newメソッド + saveメソッド または createメソッド
newでインスタンスを生成してsaveで保存する方法とnewとsaveの処理をまとめて行なうcreateというイメージ

new + save のパターン

#モデル名.new(カラム名: データ)+モデル名.saveのセットで保存される。
#引数にカラム名: データを入れることで保存内容を指定している。

post = Post.new(name: "投稿1", title: fuga, text: hoge)
post.save

createのパターン

#newメソッドとsaveメソッドをまとめて一度に実している。

Post.create(name: "投稿1", title: fuga, text: hoge)

データの更新

updateメソッド(saveメソッド) 基本的にはupdateメソッドで更新する。saveメソッドでも更新可能。
データを更新する際は、どのデータを更新するのか?となるので、元データを取得する必要がある。

updateのパターン

#どのデータを更新するのか、findで更新するデータを取得する。

post = Post.find(1)  #特定のレコードを取得
post.update(name: "投稿2", title: hoge, text: hogehoge)

saveのパターン

#カラムを指定して、それぞれデータを入れいていく

post = Post.find(1)  #特定のレコードを取得
post.name = "投稿2"
post.title = hoge
post.text = hogehoge
post.save  #保存(更新)

データの削除

destroyメソッド

これもどのデータを削除するのか?となるので、データを取得するところから。
モデル名.find(削除したいid).destroy(カラム名: データ)でデータを削除できる。

post = Post.find(1)
post.destroy(name: "投稿2")

#1行でシンプルな記述もできる
Post.find(1).destroy(title: hoge)

#レコードごと削除するとき
Post.destroy_all

データベースにカラムを追加する方法

今回オリジナルアプリの制作で、すでに作成していたBookモデルのテーブルにbookが販売中か否かを判断する、boolean型のsellというカラムを追加したのでメモしておく。
ターミナルでテーブルにカラムを追加する
rails g migration Addカラム名Toテーブル名 カラム名 : 型

% rails g migration AddSellToBooks sell:boolean

すると、以下のようにカラムを追加しましたっていうマイグレーションファイルができる。

class AddSellToBooks < ActiveRecord::Migration[6.0]
  def change
    add_column :books, :sell, :boolean
  end
end

nill制約などを付ける場合は、マイグレーションを実行する前に追記を忘れないようにしておく。 今回は、boolean型なのでデフォルトをfalseに設定するという追記もしておく。

class AddSellToBooks < ActiveRecord::Migration[6.0]
  def change
    add_column :books, :sell, :boolean, default: false, null: false
  end
end
% rails db:migrate

これでデータベースにカラムを追加できました。

終わりに

最近のブログネタはオリジナルアプリ制作のときに躓いたり、忘れていてできなかったりした基礎の部分のアウトプットになっています。理解しているつもりでいても抜けているところがあったりするので、基礎の定着は大事だなと改めて感じます。