作成したテーブルにデータを追加する方法を学習する。
具体的には下記の2点である。
- phpMyAdminを使用してデータを追加する方法
- コンソールからデータを追加する方法
phpMyAdminを利用してレコードを追加する
tweetsテーブルにレコードを作成してみる。まず、ツールから直接追加する方法を確認する。
phpMyAdminでテーブルの内容を表示する
以下の手順で「tweets」テーブルを開く。
接続に成功すると、以下のような画面が表示される。
左側に「id」「name」「text」「created_at」・・・と続いているのがカラムである。
カラムのうち「id」はレコードの番号で、自動で作成される。
「created_at」「updated_at」は、マイグレーションファイルのt.timestampsという記述によって作成されている。
メニューの「挿入」を選択するとデータベースにデータを追加できる。
「name」と「text」の「値」の欄にそれぞれデータを入力し、カラムを編集してみる。
以下を参考に3つレコードを作成し、それぞれの「name」「text」に適当に値を入れてみる
下記の入力を3回繰り返し、レコードを3つ作成する。
created_atとupdated_atのカラムが空欄だとエラーになってしまうため、合わせて入力する。
3回入力後、表示を選択し、以下のようにレコードが3つ作れていれば完成。
コンソールでの操作を学習する
Railsには、ターミナルから対話式にRailsを動かす機能が備わっているます。
これを、コンソールと呼ぶ。
本項ではコンソールを利用して、テーブルからレコードの情報を取得するコードを試す。
コンソールからレコードの情報を呼び出す
rails c コマンド
rails c とは「rails console」(コンソール)の略である。
コンソールを実行すると作成したRailsアプリケーションのメソッドやクラスなどを実際に呼び出すことができる。
ターミナルから「rails c」コマンドを実行することでコンソールを起動できる。
例
$ rails c # コンソールの起動 [1] pry(main)>
コンソールを起動するとpryと表示され、この横にメソッドなどを書いていくことができる。
コンソールを終了するには、コンソール上で「exit」と入力しエンターキーを押す。
例
[1] pry(main)> exit # exitと書きエンターキーで実行(ターミナルに戻る) $
慣れないうちは、ターミナルとコンソールの両者の見た目があまり違わないため、区別がつきにくい。
しかし、機能は大きく異なる。
この2つを例えるなら、MacなどのOSとChromeなどのアプリケーションとの関係に似ている。
ターミナルでコマンドを実行してコンソールを起動することは、MacなどのデスクトップにあるChromeのアイコンをダブルクリックして起動することと意味は同じである。
そして、コンソールはRailsを操作したり、動作を確認するためのアプリというイメージである。
操作をしているうちにターミナルで実行すべきコマンドをコンソールで実行してしまいエラーが出る、ということが良くある。
自分が実行するコマンドはターミナルで実行するものなのか、コンソールで実行するものなのか注意が必要だ。
テーブルの情報をRails側で利用する方法
あるテーブルに保存されているレコードの情報を取得するには、名前によって関連付ける必要がある。
例えば、tweetsテーブルに保存されているレコードの情報を利用するためにはTweetクラスを用意する必要があるのだが、 rails g model コマンドを利用することでこれらを一度に生成できる。
テーブルと、関連するモデルクラスがある現在の状態であれば、コンソール上から実際にコードを書いてテーブルの情報を取得する方法を試すことができる。
tweetsテーブルからidカラムの値が1であるレコードのnameカラムの情報を取得するには以下のようする。
pry(main)> tweet = Tweet.find(1) => <Tweet:0x00000001d98860 id: 1, name: "araki", text: "こんにちは!", image: nil, created_at: nil, updated_at: nil> pry(main)> tweet.name =>"araki"
1行目は、Tweetクラスのfindメソッドを利用しているかたちである。
なぜ定義されていないfindというメソッドが使えるのかであるが、これについては後述する。
すると、返り値はtweetsテーブルのカラム名をプロパティとして持つTweetクラスのインスタンスとなる。
この時各プロパティの値は、該当レコードのカラムの値と一致する。
今回の場合は、idカラムが1のレコードの値である。
1行目によって定義された変数tweetにはTweet.find(1)によって得られた返り値である上記のTweetクラスのインスタンスが代入されている。
ここから各カラムの情報を取得したい場合は、2行目のようにカラム名をメソッドとして書く。
ActiveRecordの仕組み
Railsでは、ActiveRecordと呼ばれる仕組みを使うことができる。
これは、RailsからSQLサーバーへのアクセスを簡単にできるようになるライブラリである。
上で見たように、定義されていないfindというメソッドを使えるのも、ActiveRecordが用意してくれているためである。
rails g modelコマンドで生成されるモデルクラスは全てApplicationRecordというクラスを継承しているが、ApplicationRecordクラスがさらにActiveRecordを継承している、という仕組みになっている。
ActiveRecord
ActiveRecord(アクティブレコード)はRubyのGemの一種である。
SQLサーバーからデータを読んだり書き込みをするためには、SQL文という命令を記述して実行する必要がある。
このGemはRubyのメソッドを使用するだけでSQL文の発行を行ってくれる。
実際に、この機能を利用する場合は、ApplicationRecordを継承したクラスを作成する。クラスの継承についてはあまり意識しなくても基礎学習では問題ない。
以下で簡単に解説をするが、大まかな概念だけ押さえておけばOKである。
例えば、今回生成しているtweet.rbを見てみよう。
【例】
app/models/tweet.rb
class Tweet < ApplicationRecord end
tweet.rbの1行目に< ApplicationRecordと書いてある。
<マークはマークの右に書かれたクラスを継承していることを示しているので、TweetクラスはApplicationRecordを継承していることになる。
また、先に記載したようにApplicationRecordはActiveRecord::Baseを継承しているため、ApplicationRecordクラスを継承すればActiveRecordで定義されたメソッドを使える、ということになる。
クラスの継承
あるクラスに定義されたメソッドを、別のクラスで利用できるようにすることを継承と言う。
今回の例で考えてみるため、以下の図を参照する。
ここでは 元となるクラスを親クラス、親クラスのメソッドを引き継ぎ新しく作成するクラスを子クラス とする。
allメソッドやnewメソッドは、ActiveRecordクラスのメソッドである。
ApplicationRecordクラスはActiveRecord::Baseを継承しているため、TweetクラスにApplicationRecordクラスを継承させればActiveRecordのメソッドを使うことができる。
さらにTweetクラスで新たなメソッドを定義すれば追加して使用することができる。
次の投稿で実際にActiveRecordのメソッドを利用することで、理解を深めていく。