rails sqliteでのカラム削除の方法
Progate Rails 9章写経中、postsテーブルにuser_idというカラムを追加するとこで詰まったのでメモ。コードは合ってるのにどうも上手く動かんなーと思ってたら、どうやらカラムを追加するテーブルを間違えてたようです。
本来はuser_idというカラムをpostsテーブルに追加するところ、usersテーブルに追加してたようで、一度カラムの削除が必要になりました。
最初はDB側からコマンドで削除しようとしたのですが、SQLiteだとカラムを削除するコマンドが無いようで、テーブルをコピーしたり色々必要そうでめんどくせーとか思ってたら、Rails側でDBいじれるの忘れてました。。Railsすげー。
以下、やり方です。
1.ターミナル上で、こちらを入力。
rails generate migration Removeカラム名Fromテーブル名 カラム名:型名
(カラム名とテーブル名の先頭は大文字から始める!)
削除するのにgenerate?と違和感を感じますが、あくまでDBを操作するためのmigrationファイルをgenerateするためです。
2. rails db:migrateでマイグレーションファイルを反映
このコマンドをターミナルで入力することで、さきほどmigrationファイルに書き込んだ変更内容をDBに反映させます。
3.完了!!
実際に試してみましょう。
赤丸のuser_idが今回消したいカラムです。
ターミナルから、コマンド入力。
すると、こんなマイグレーションファイルが生成されます。
なんかいかにも削除してくれそうな感じです。頼もしい。
ちなみに、generateコマンドを入力ミスすると、changeメソッドの中身が空のマイグレーションファイルが生成されるので、一度中身を確認してからdb:migrateするといいかも。
からの、db:migrate。
これで出来たはず!もう一度DBの中身を確認してみます!
passwordカラムの横にあったuser_idカラムが消えました!!やったー!!!
比較
変更前:
変更後:
【エラーの素】Atomで全角スペース探せるよ!
コード書いてると、誰でも一度は全角スペースのせいでエラー起こした経験はあると思います。
特にプログラミングを始めて最初の方だと、スペースが原因でエラーが起きるなんて思わないでしょう。私のAtomは、かな入力モードでバックスペースを2度押すと自動で全角スペースが発生するというクソ素敵仕様で、HTMLがバグ祭りになって、最初はかなり悩まされました。
そして何かエラーが発生するたびに、横矢印キー(→)をひたすらカチカチして探すわけですが、これ、とんでもなく非効率でした。
実はAtomの検索機能で探せるんです。
やり方
Atomを開いてcommand + Fで検索タブを開き、全角スペースを入力する。
おわり。
適当な行に全角スペースを2つ入れてみましたが、しっかり見つけてくれました!
構文エラーが出たときは一回やってみるといいかもです。
rails個人的アウトプット インスタンス変数 scaffold db:migrateについて
現在railsの学習を、こちらの教材を使って進めています。
進めていてアレッ?となった部分をSinatraと比べたりして自分なりにアウトプット指定効果と思います。
・@から始まるアレは何?
インスタンス変数。コレに入れた値をコントローラからビューへと渡してくれます。
上の画像の@timeですね。
Sinatraでいうと、画像の@res @starと同じ働きをします。
Sinatraだとルーティング内に書いてたものを、railsだとコントローラーに書き込み、それをビューで読み込むっぽいです。
・scaffoldてなんだ
rails初学者向けの教材で序盤に出くわすやつ。「すかふぉるど」と読むらしい。
rails g scaffold book title:string memo:text
このようなコマンドだけで、DBのテーブル構築とかしてくれる...強すぎ...
rails g scaffold モデル名 カラム名:データ型 カラム名:データ型
こんな風に使えます。
Sinatraの時はsequelでひとつひとつ手入力でテーブルを作っていたのですが、コレだと連動するモデルやらコントローラーもまとめて一緒に作ってくれて感動!
ちなみに宣言したモデル名(上のコマンドだとbook)を複数形にして自動でテーブルを作ってくれるぞ!かしこい!
・マイグレーションてなんだ
SQLを書くことなく、rubyの分だけでDBのテーブル作成してくれる機能。
ActiveRecordがRubyの文をSQLに翻訳してくれてます。
db:migrateを実行することでDBも更新される。
プログラミング学習、今のとこの一番の敵はスマブラです。プロコン買っちゃった。