「DIVE INTO CODE」学習記録 #27
こんにちは。
27日目。Railsでアプリ開発。Macの「numbers」で作成したcsvファイルをDBに読み込ませる方法について。
学習内容
【オリジナルアプリ開発「免許学科試験学習アプリ」】
- 大枠の作成
- DBにcsvファイルを読み込ませる
- 一問一答機能作成
感想
今回からオリジナルアプリを実際に作っていきます。
前回のブログで書いた通り、「免許学科試験学習アプリ」の作成です。
とりあえずrails newで新しいディレクトリを作り、
必要なコントローラ、ビュー、モデルをgenerateする。
今回はdeviseでログイン機能つけようと思い、
userモデルはdeviseで。
基本的な部分は覚えている部分とテキスト見ながらで作成できます。
やりながら次どうするかを色々考えていくと、
「これができない」ってなったポイントが何点か浮かぶ。
- ページのルーティングが思うようにできない。
- 基本的なJSのコーディングを完全に忘れている。
- cssの扱いで時間がかかる
わからんことが溜まっていき、どっから手つけようってなります。
とりあえず、JSで一問一答作るにしても、
ルーティングを考えるにしても、
コンテンツのメインである「免許の問題」が、多少なりとも画面に反映されないとイメージしづらい。
まず、練習を兼ねてcsvファイルでDBに問題を何個か読み込ませよう。
そんなわけで、やり方書いていきます。
CSVファイルをrailsで作成したDBに投入する手順
1、CSVファイルを作成する
まずはcsvファイルの作成。
csvファイルとは、
こんな感じに、中身のデータがカンマ(,)で区切られているデータファイルのことを言うそうです。
これは野球選手のデータのcsvファイルになります。
このような形式のファイルを用いることで、
ファイルデータを直接Railsで作成したDBのtableに入れ込むことができます。
今回はcsvファイルをMacのnumbersで作成してます。
Excelでもメモ帳でも、テキストエディタと呼ばれるものであれば何でも作成可能です。
エディタを開き、
以下のようにデータを打ち込んでいきます。
一番上の行に、
「データを挿入したいtableのカラム名」を入れます。
今回は免許の問題なので、railsに作成した、
「questionモデルに対応するquestionsテーブル」
に、
「id、content、answer、explanation、imageの5カラム」
を作っていたので、このような書き方をしました。
データを入れましたら、csv形式にして保存します。
Macのnumbersの場合、画面の一番左上、
「ファイル」>「書き出す」>「CSV」
で保存すれば完了です。
2、作成したcsvファイルをrailsアプリのdbファイルに入れる。
作成したcsvフォルダを、railsアプリの「db」ディレクトリ直下に入れます。
下の写真はAtomエディタで作成中の免許アプリにファイルを挿入した写真です。
最初に説明した通り、csvファイル内のデータがカンマで区切られているのがわかります。
3、db/seeds.rbファイルを編集する。
次は同じくdbディレクトリ直下のseed.rbを編集します。
以下のようにコードを記入すると、csvデータとtableカラムがうまい具合に対応し、綺麗にデータが挿入されます。
書いたコードです。
require "csv" CSV.foreach('db/question_test.csv', headers: true) do |row| Question.create(field_id: row['field_id'], content: row['content'], answer: row['answer'], explanation: row['explanation'], image: row['image'], ) end
tableカラムとcsvファイルの一番上に書いたカラムの、
紐付け作業をしている感じです。
最後にターミナルで「rails db:seed」を実行し、挿入完了。
ターミナルで「rails c」して、
コンソールでDBを見ると、データが入っているか確認できます。
※「[1] pry(main) > Question.all」でQuestionテーブルを確認しました。
とりあえずこれでDBに10問ほど問題を入れ込み完了しました。
また、ここには書いてませんが、
免許学科試験には出題される問題に「分野」(運転の心得、けん引・・・とかそういうの)があり、
分野も30弱ほどあったのでDBに「fieldテーブル」として挿入しております。
データを取り出しやすいように、分野テーブル(fields)と問題テーブル(questions)を,
「field_id」をキーとしてアソシエーションも組んでみました。
(うまくできているかはわからない。)
DBからデータは引っ張り出せるようにはなっているので、次は上手いことルーティング作って、いろいろなページ遷移を構築する必要があります。
今ここで正直少し詰まってます。
ルーティング。
一問一答機能。
この二つのクリアが当分の課題になりそうです。
作成にあたり、いろいろな免許学習アプリを参考にしてるのですが、
めっちゃクオリティ高いものがたくさんあり、
どうやってこーいうの作ってんだ。
って感想ばっかです。
どこまでクオリティ上げられるかわかりませんが、
色々真似してみます。
以上ありがとうございました。