Rails

Rails Tutorial 拡張機能 part.1(正規表現とSQLを触ってみる)

目標

rails tutorialを二週読み終わったところで自分なりに作ってきたsample_appを拡張していこうと思う

変更部分: tutorialではFaker gemを使用してブロック変数n内にて百人のユーザーを生成した。

目標1:今回はアルファベット大文字、小文字、英数字から出来た
5,6,7,8文字の文字列を名前にもったユーザーを千人作成。
正規表現を活用

目標2:仮定として名前の文字数の割合を出してほしいといった仕事の依頼が上がった場合を想定する。
SQLを活用して、割合を導き出してみる。

目標1の実装

まずは正規表現から考えてみる。
条件の3種類を範囲で指定して配列にする。
[*:A..:Z,*:a..:z,*0..9]

Arrayクラスのsampleメソッドで引数に5~8を持たせればいいのか?
sample(5..8)
→エラー(範囲オブジェクトはわたせなかった)
ので
sample(randam)
として引数にstringを渡してブロックが実行されるたびランダムな数値5~8を実行できるような構成を考えた

integerクラスのrandメソッドで引数に範囲5..8とわたしてそれを変数として代入
randam=rand(5..8)

最後にstringクラスのjoinメソッドで
「配列としてとりだしたランダムなintを文字列として連結」させた

まとめたのが↓

db/seed.rb
99.times do |n|
  random = rand(5..8)
  name  = [*:A..:Z,*:a..:z,*0..9].sample(random).join
  email = "example-#{n+1}@railstutorial.org"
  password = "password"
  User.create!(name:  name,
               email: email,
               password:              password,
               password_confirmation: password,
                activated: true,
                activated_at: Time.zone.now)
end

目標2の実装

Tutorial を終えた時点でのSQLの認識は
アクションが実行された時にサーバー側で勝手にSQLリクエストが発行されているなぁ位でした。
実際にじぶんでリクエスト文を作成する事が無かったので感覚的にすこし距離があるかなぁと、理解を深めづらかったとこがある印象です。
ここで簡単にでも一度さわってみたいと思って実装しました。

コンソールでコマンドを打つ事でデータベースにアクセスして自分でSQL文を作成、取りだしたりしていじってみるのも踏み出しとしていいかなと思います。

DevelopmentデータベースにSQLコマンドでアクセス

↓参考
https://www.dbonline.jp/sqlite/ini/index1.html

今回のTutorialではSQliteを導入してますので参考にした記事通り行って行きます。

初心者はデータベースにアクセスするだけでも時間を食います。30分はまりました。

$~/workspace/sample_app (master) $ sqlite3 sample_app
SQLite version 3.8.2 2013-12-06 14:53:30
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> .database
seq  name             file                                                      
---  ---------------  ----------------------------------------------------------
0    main             /home/ubuntu/workspace/sample_app/sample_app        

.tables はコマンドの一つでテーブルを羅列してくれます。入れたかな?と確認のため打ちました。
テーブルは0だし
階層もおかしいし
単純なコマンド故に何が違うのかも分からない。

先生にお話を聞いた結果

データベース名はdevelopment.sqlite3(tutorialでも触ったなぁ)

dbディレクトリまで移動してからsqlite3コマンドを実行するんだよ。と教えて頂きました。

 $ sqlite3 development.sqlite3 
SQLite version 3.8.2 2013-12-06 14:53:30
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> .tables
ar_internal_metadata  microposts            users               
comments              relationships       
likes                 schema_migrations   

SQLコマンドを使ってデータベースをいじってみる

select from where .etc

など書籍は読み込んでいるのでだいたいはわかっていたつもりですがアウトプットする機会がないと身につかないなぁとしみじみおもいました。

まずは名前が5文字のユーザーの名前を取得

sqlite> select name from users where CHAR_LENGTH(name)==5                                                                                                                                                
   ...> ;
Error: no such function: CHAR_LENGTH
sqlite> select name from users where LENGTH(name)==5;
6VlUk
ukgr5
iplcn
upT1E
eQhJG
Hbzx0


↓参考
http://www.sql-reference.com/string/char_length.html

SQLは ; までで一文とのことです。
上では一度エラーを起こしてますがLENGTH()で無事引っ張れました。
が、結果がたくさん羅列されて非常に見にくい。
件数表示はどうするのかなぁと↓参考
http://www.sql-reference.com/summary/count.html

sqlite> select count name from users where LENGTH(name)==5;                                                                                                                                               
Error: no such column: count
sqlite> select count (name) from users where LENGTH(name)==5;                                                                                                                                              
26

と言う事で5文字のUserは26件でした。
6,7,8と繰り返して割合も簡単に出せます。

以上です。

まとめ

勉強するべきことがまだまだあるなぁと改めて思います。

正規表現もSQLも必修ですね。先は長い