rails dbコマンド一覧
コマンド | 意味 |
---|---|
$ rails db:create | config/database.ymlの内容をもとにDBを作成する |
$ rails db:migrate | db/migrateディレクトリにある全てのマイグレーションを実行する |
$ rails db:rollback | マイグレーションのバージョンを1つ下げる |
$ rails db:rollback STEP=2 | マイグレーションのバージョンを2つ下げる |
$ rails db:migrate:status | 現在のマイグレーションファイルの状態を調べる |
$ rails db:drop | データベースを削除する(要注意) |
$ rails db:reset | 一度DBを削除した後に、schema.rbを元にテーブルを再作成する (seedデータも読み込んでくれる) |
$ rails db:migrate:reset | 一度DBを削除した後に、db/migrate/**.rb を元にテーブルを再作成する (seedデータは読み込まない) |
$ rails db:setup | $ rails db:create $ rails db:schema:load $ rails db:seed この3つのコマンドを行ってくれる |
rails db:migrateを複数回実行したらどうなる?
同じテーブルが作成されてしまうようなことはありません。
なぜ?
rails db:migrate
を実行するとschema_migrateionsというテーブルからmigration IDを確認し、実行されていないmigrateionを見つけるとそれに対応するmigrationファイルを実行するため。
■参考にした記事
Ruby on RailsでDB(データベース)を作成する方法 | TechAcademyマガジン
【Rails】rails dbコマンドまとめ - Qiita
【Rails】マイグレーションファイルを徹底解説! | Pikawaka - ピカ1わかりやすいプログラミング用語サイト
プログラミング学習への取り組み方
はじめに
全くの未経験者である私がプログラミングスクールに入学して約2ヶ月経ち、その中で早くも意識が変わったことがありました。
この記事では、この2ヶ月で学んだ下記3点について、アウトプットしたいと思います。
・プログラミング学習の進め方
・エラーに対する考え方
・技術面で成長したこと
本記事の作者について
本記事を書いている私がどのくらいの未経験かというと、プログラミングの勉強を始めようとしたらみんな通るであろう、「Progate」さえ入学の1ヶ月前にその存在を知り、そこから勉強を始めたくらいの超初心者です。
それまでは、ずっとスタバの店員さんをやりながらコーヒーの勉強をするという、プログラミングとは無縁な生活を送っていました。
そんな私のように今はまだ「プログラミングってよくわかってないけど気になる」っていうような人や、独学で勉強しているけどスクールに入るか迷っている…というような人にむけて参考になるような情報をお届けしたいと思います。
※ちなみに私は10月のRUNTEQ(プログラミングスクール)入学のタイミングで仕事を辞め、今はフルコミットで毎日勉強しています!
この記事の対象者
・プログラミングの勉強を最近始めた方
・以前プログラミングを独学で学んでいたが挫折し、スクールに入学するか迷っている方
プログラミング学習の取り組み方
【復習】と【学習を進めること】のバランス
入学前の学習に対する意識→「準備(復習)が一番大事」
準備が8割ともいうように、今までは何かをするときにはきちんと準備をすることに一番重きを置いていました。
それはプログラミング学習をする上でも同じで、「今勉強している知識がちゃんと理解できてから(復習をしっかりしてから)次に進もう」と常に考えながら進めていました。
それが、最近では復習を大事にしつつも、「わからなくてもずっとそこに留まる(きちんと理解するまで復習し続ける)のではなく、一旦進んでみる」ことを意識して進めるようになってきています。
「進める」とはどういうことなのか?少し考えてみました。
(私がこのブログの中で使っている【復習】と【学習を進める】の解釈なので、正しい正しくない、というよりは「そういう意味で使っているんだな」と読み進めていただけると嬉しいです)
|
なぜ理解しきらずとも学習を進めていくことが大事なのか
私が「とりあえず進んでみよう」と考えるようになった、この2ヶ月間についてお話します。
RUNTEQのカリキュラムに入る前は、railsチュートリアルを勉強していました。
railsどころか、プログラミング経験も全くない私にとってはわからないことの連続でしたが、1周目より2周目、と何度も復習することで少しずつ理解できる部分が増えていくのが実感できました。
2周目でやっと理解できる部分もあれば、2周してもまだわからないと感じる部分もあります。 このとき私は「基礎がわかっていれば次に進んでも理解できて、さらにその次に進めやすいはず。だからわからない部分を完全に潰してからカリキュラムに入ろう」と考えていました。
RUNTEQでは、そんな学習の進捗などをslackのtimesでつぶやいたりできるのですが、そこで講師の方が「次に進んじゃいましょう!」とアドバイスをくださいました。
その時は【わからないことがある中で学習を進める】ということに少し不安がありましたが、アドバイスいただいた通りにRUNTEQのカリキュラムを進めてみることにしました。
実際に進んでみるとカリキュラムはレベルが高く、やはりわからないことの連続です。 進めるだけどんどん新たな知識が出てきて、わからないこともさらに増えていきます。
「わからないことだらけでもなんとか理解しよう」と、とにかく頭を使っているため、夕方頃になるとめちゃめちゃ頭が痛くなるし、カリキュラム始めたての頃は「やっぱりまだカリキュラムを進めるレベルまで達していないんじゃないのか、このまま進めていて大丈夫なんだろうか…」と不安になっていました。
ただ、進めていく中で新たな発見がありました。
新しく出てきた知識の意味がよくわからず、理解できなければ全く勉強していないのと同じかというとそんなことはなく、見たことのある単語として頭の片隅に残っているということです。 使い方がよくわからないのでその時はまだ、ただの点でしかないですが、学習を進めていくと急にその点と点がつながる瞬間があります。
「あの時出てきたあれってこうやって使うのか!」
こんなふうに急に理解できる瞬間が訪れるときがあるので、その時のために今は多くの点を作っておくことが重要です。 もちろん、一つ一つ自分が納得できるところまで理解してから次に進む…というやり方でも最終的に「理解する」という点では同じです。
ただ、【どちらの方が技術を習得していくのに効率的か】を考えた時に、学習を進めることも意識する方が同じ時間で理解できる量が多いように感じるため、まだ覚えることが山のようにある今こそ、スピード感も保ちながら進めていくことを意識しています。
ちなみに、プログラミングスクールに通っている方はカリキュラムなどがあると思うので、それを進めることがコードを書くことに繋がるんじゃないかと思うのですが、独学なら恐らく勉強している参考書などがあると思うので、読み進めるだけではなく、実際にコードを打ってみることが早い成長につながるんじゃないかと思います。
エラーに対する考え方
やっぱり初めて見るエラーとか出ると「何これ…」って戸惑いますよね。
まだチュートリアルに取り組んでいた段階では「とにかくエラーが出ないこと」が一番良いこと、と一生懸命解答を真似しながら、間違いがないかじっくり確かめて進んでいました。
もちろん、初歩的ミスによるエラーで何時間も悩むよりは、そういったケアレスミスをなるべく無くして他のことに時間を使えることがベストではあると思いますが…!
今はケアレスミスのエラーでさえ勉強になると思っています。 エラーとたくさん出会えば、【どこが原因でエラーが出ているのか】、原因を切り分けて考えていく力をつけることに繋がっていきます。(後ほどの技術面で成長したことの中で、どんな風に切り分けを行うのか、の一例を記載しています)
また、よく出るエラーがわかってくるようになると、対処にかかる時間もどんどん短くなっていきます。
そして、プログラミング学習の進め方のところでもお伝えしたように、やはりエラーと出会うことは「こういうことか!」と点と点が繋がる瞬間に出会わせてくれることも多々あります。
そういった経験から、最近は「とにかく手を動かして、エラーに慣れよう」「復習も大事だけど、進むことも意識しながらたくさんの点を作っていこう」と経験を積むことを特に重要に捉え、進めています。
これは性格によって合う合わないもあるかもしれないので、人それぞれではありますが、「準備が第一」という価値観を持っていた私の中ではこの2ヶ月間で一番成長した部分かな、と思っています。
技術面で成長したこと
学習の進め方やエラーに対する考え方が変わったことで、「ちゃんと技術的にも成長してるよ」ということもお伝えしたいので、長くなりますがこちらもシェアします。
もし見ていただける方は折りたたみボタンを押してサラッと見ていただけたら嬉しいです!
(もしプログラミングはじめたての方がこの記事を読んでいたら、正直なんのこっちゃわからないかと思うので、「2ヶ月でこれだけ考えられるようになるんだなぁ」くらいに流し読みしてもらえればOKです)
なんのことかわからない、という人のためにお伝えすると、
HTMLを調べたいページで右クリック→検証をクリック 例えばテストのエラーがなぜか通らない、とか期待する動きをしてくれない…といった時に、今までは自分の書いたビューテンプレートとばかりにらめっこしていました。
それでもわからずに、講師の方に質問した時に「実際に出力されているHTMLを見てみてください」と助言をいただき、解決できたことがあります。 実は書き方がちょっと間違っていて自分が思ったようなHTMLに変換できていなかった、とか記述の仕方は合っていたけど記述する場所がちょっとずれていてエラーに繋がっていた、などビューテンプレートを見るよりも実際のHTMLを参照する方が気付きやすいこともあります。 その時自分の中で試したことは、
①まずはボタンを押して、コントローラのアクションが反応しているのか?
→アクション内にbinding.pryを入れてみる
→ページが読み込み中になってconsoleが起動している
→アクションは読み込まれている ②アクション内のparamsで内容が受け取れていない?
→binding.pryが起動しているので、開いているconsoleでそのまま検証してみる
→paramsで変更内容も受け取れている ③アクション内は問題なさそうなので、ビューの問題?
→jsを使っているので、
そのファイル自体の読み込みができていない or ファイルの読み込みはできているが、記述ミスなどで内容が反映されていない
このどちらか?と予想 →原因を切り分けるために、まずはjsファイルの中身が反映されているのか確認
→次にファイル自体の読み込みができていないのかを確認
該当のjsファイルの先頭にdebuggerを置き、consoleが開くか確認してみることに
→consoleが開いた! →ということはjsファイルの ちなみに反映されない原因は 最後まで原因を突き止めきれなかったものの、「どこのファイルに問題があるのか」というところまではたどり着くことができるようになっていました。見てくれる方はこちらをクリック
①出力されるHTMLを見るようになった
入学前の勉強はまだProgateしかやっていなかったので、それまで見なかったのも当たり前といえば当たり前なんですが(笑)、入学してRailsチュートリアルを勉強し、RUNTEQの学習カリキュラムを進めていくうちに意識できるようになったことの一つです。
そうすると出てくる、こんなやつです。
②エラーが出た時にどこまで動いているのか、原因の切り分けを意識的に行うようになった
具体的なお話をすると、「編集機能をajax化する」といった課題がありました。
ひとまず実装は済んで「さぁ動かしてみよう!」とボタンを押してみたものの反応がない….js-edit-comment-button
を押したらアラートが表示されるか実験
→表示されない…
$(".js-edit-comment-button").on('click', function()
「この表記が間違っているか、HTMLファイルの方のこっちの表記がどこか違うのか」というところまで推測したところで原因が突き止めきれず…
<a href= '#', class: "js-edit-comment-button", data-comment-id-"<%= @comment.id %>">
<a href= '#', class: "js-edit-comment-button", data-comment-id-"<%= @comment.id %>">
このコードのclass:
の部分がaタグなのに:
で表記されていたためうまく動かないという初歩的ミスでした。(正しくはclass=
)
最後に
この短い2ヶ月という期間で、ここまで考えられるようになったのは自分の努力のみかというと、RUNTEQに通っていたからこそだと思っています。
独学で始めていたら、こんなに早い段階で「とにかく手を動かそう」と考えて、とにかくコードを打っていたか?私だったらNOです。
エラーで詰まった時はもちろん、まずはネットでめちゃくちゃ調べてみたり、理解できていないであろう部分を復習してみたりします。
それでも中々解決できない時に、講師の方に質問することができる環境があるからこそ、「エラーに詰まって進めなくなるんじゃないか」という心配なく「やってみよう!」と進めることができ、コードを書いていくことで経験をより積んでいくことができます。
そして、現場で求められるであろう、わからない時に【原因を切り分けて先輩に質問する力】についても、RUNTEQで質問をすることが良い練習になっています。
とは言いつつも、まだまだ勉強することもたくさんありますし、毎回上手に質問できているかというとそうでない時もある未熟者ですので、精度を上げていけるよう、引き続き頑張っていきます!
【Ruby】gemとは?
gemとは
rubyのライブラリのこと。
便利な機能をまとめたもので、インストールして使うことで、作業効率をあげられる。
bundler
gemを管理するためのルールで、bundler自体もgemの一種。
Gemfileを使ってgemの依存関係を管理してくれる。
gemを使うには?
Gemfileにインストールしたいgemを記述し、$ bundle install
することで、gemがインストールされる。
ruby '2.6.6' gem 'rails', '~> 6.0.2', '>= 6.0.2.1' gem 'sqlite3', '~> 1.4' gem 'puma', '~> 4.1'
#Gemfileに記述したあと、コマンドで実行する
$ bundle install
Gemfile.lock
Gemfileをもとに、実際にインストールしたgemの正確なバージョンが記載されている。
(私たちが書き込むものではなく、bundle install
でgemをインストールすると自動的に更新される)
Gemfileで特にバージョンを指定しなかった場合は、最新のバージョンがインストールされ、Gemfile.lockにも記載される。
■参考にした記事
rails routesコマンド
$ rails routesコマンドを実行すると何が確認できるか?
私の手元で実行してみた結果がこちらです↓
Prefix Verb URI Pattern Controller#Action letter_opener_web /letter_opener LetterOpenerWeb::Engine root GET / static_pages#top login GET /login(.:format) user_sessions#new POST /login(.:format) user_sessions#create logout DELETE /logout(.:format) user_sessions#destroy password_resets POST /password_resets(.:format) password_resets#create new_password_reset GET /password_resets/new(.:format) password_resets#new edit_password_reset GET /password_resets/:id/edit(.:format) password_resets#edit password_reset PATCH /password_resets/:id(.:format) password_resets#update PUT /password_resets/:id(.:format) password_resets#update edit_profile GET /profile/edit(.:format) profiles#edit profile GET /profile(.:format) profiles#show PATCH /profile(.:format) profiles#update PUT /profile(.:format) profiles#update users POST /users(.:format) users#create new_user GET /users/new(.:format) users#new board_comments POST /boards/:board_id/comments(.:format) comments#create edit_comment GET /comments/:id/edit(.:format) comments#edit comment PATCH /comments/:id(.:format) comments#update PUT /comments/:id(.:format) comments#update DELETE /comments/:id(.:format) comments#destroy
それぞれ何を表しているのか説明すると…
Prefix
後ろに_path
と付けてlink_to
などで使うとそのページに飛ぶことができる
Verb
HTTPメソッドの種類
URI Pattern
ルーティングのパスのこと
Controller#Action
対応しているのはどのコントローラのどのアクションかが記載されている
-gオプション、-cオプション
$ rails routes -g < URLヘルパー名、HTTP動詞、URLパスのいずれか >
URLヘルパー名、HTTP動詞、URLパスのいずれかに部分マッチするルーティングが出力される
rails routes -g root_path rails routes -g GET
`rails routes -c < コントローラ名 >
指定したコントローラに対応するルーティングだけ出力される
$ rails routes -c users
■参考にした記事
【Rails】rake routesコマンドの使い方をマスターしよう! | Pikawaka - ピカ1わかりやすいプログラミング用語サイト
【Ruby】メソッドとは
メソッドとは?
関数とは「特定の処理をまとめた塊」のことでメソッドとも呼ばれています。
(↓下記の記事の内容を拝借しました)
【Ruby入門】 関数(メソッド)の使い方まとめ【型 引数 戻り値】 | 侍エンジニア塾ブログ(Samurai Blog) - プログラミング入門者向けサイト
メソッドの種類
◇組み込み関数
Rubyにあらかじめ用意されているメソッドのこと。(join、push、to_iなど)
◇ユーザー定義関数
自分で作成したメソッドのこと
↓例えばこんな感じ(fooを呼ぶと'hello!'と返すメソッドを作成している)
def foo p 'hello!' end
■参考にした記事
Re: Rubyの関数とメソッドの違いってなんだろ! - Qiita
【Ruby入門】 関数(メソッド)の使い方まとめ【型 引数 戻り値】 | 侍エンジニア塾ブログ(Samurai Blog) - プログラミング入門者向けサイト
【Ruby】ゲッター/セッターとは
ゲッター
通常、インスタンス変数はクラス内でないと参照できない。
クラス外でも参照したい時に使うのがゲッターメソッド。
class Dog def initialize(name) @name = name end def getName #「ゲッター」メソッド @name end end dog = Dog.new('チワワ') #ゲッターメソッドを定義することで、クラスの外でも@nameを取得できる p dog.getName #=> 'チワワ'
セッター
クラス外でインスタンス変数の値を変更したい時に使うのがセッターメソッド。
class Dog def initialize(name) @name = name end def setName=(name) #「セッター」メソッド @name = name end end dog = Dog.new('チワワ') #セッターメソッドを定義することで、クラスの外でも@nameを変更できる dog.setName = 'トイプードル' p dog.getName #=> 'トイプードル'
便利なアクセサメソッド
def setName=(name) @name = name end
Rubyにはわざわざこのようにゲッター/セッターを定義しなくても、1行追加するだけで可能にしてくれるメソッドがある。
それがアクセサメソッド。
メソッド名 | 役割 |
---|---|
attr_reader: | ゲッターと同じく、クラスの外で参照できるようにする |
attr_writer: | セッターっと同じく、クラスの外で変更できるようにする |
attr_accessor: | ゲッター/セッター両方の機能をもつ (クラスの外で参照・更新ができる) |
アクセサメソッドの使い方
class Dog attr_accessor :name def initialize(name) @name = name end end dog = Dog.new('チワワ') dog.name = 'トイプードル' # attr_accessorが追加されているので、そのままnameを参照できる p dog.name #=> 'トイプードル' # attr_accessorが追加されているので、そのままnameを呼び出せる
■参考にした記事
静的型付けと動的型付けの違い
静的型付け
JavaやC,C++などの言語が静的型付け言語。
何の型が入るか宣言(intなど)が必要なため、コードの記述量が増えるといった点があるが、事前に型がわかっているので、実行速度が早くなる。
動的型付け
Ruby、JavaScript、Pythonなどが動的型付け言語。
静的型付け言語の逆。データ型の宣言が必要ないため、コードの記述量が減る=初心者にとっては学びやすい。
一方で事前に型がわからないので、実行時に検証を行うため、静的型付けと比べると実行速度が遅くなる。
■参考にした記事
静的型付け言語と動的型付け言語の違いとメリット|Tasting.com 【サービスリリース予定】エンジニアのためのポートフォリオ管理、マッチングツール"NaxState"|note