Deep in Deep

プログラミング勉強中。遠回りですが、ゆっくり深く学んでいきたい。

生RubyでActiveRecordを使ってみる(接続編)

生のRubyで色々頑張ってみた

最近 、久保秋真先生の「作りながら学ぶRuby入門 第2版」という本を読みながらRuby門中

他の入門書とはだいぶ色が違って、文法の細かい解説等は必要最低限な入門書。とにかく「作りながら」学んでいく、パラシュート学習法を体現したような本。

正直、この本からRubyを始めます!って言う人には勧めにくいが、一度他の書籍でRubyの基本的な文法を学んだ後に取り組むにはいい感じ。

他の書籍だと、文法等の解説が細かい分、サンプルコードというか、書籍の中で作り上げるサンプルプログラムの規模に限界がある。

本書だと、文法の解説を最小限にした分、出来上がるサンプルプログラムはDBMSと連携させたり、実際にWebアプリとしての形で完成するものとなっている。

世の中にはRuby on Railsという便利なフレームワークがあるではないか、という人もいるかもしれない。

ただ、フレームワークは様々な機能を裏側でやってくれており、使う側も中でどのような処理が行われているのか理解しないまま使っていることも多いのかもしれない。

少なくとも、自分はそうでした。

こういった便利なツールの裏側でどんな魔法が使われているのか、少し紐解いていくことでコードがスッキリかけたり、見慣れないエラーが出た時の対応も、訳もわからず使っている時よりはしやすいはず。

Rubyでデータベースとの連携をやってみる

前置きが長くなったが、とりあえず本書の教えの通り、純真無垢な生Rubyであれやこれやすることにした。

準備編

まずはDBとの連携だが、本書のサンプルコードではDBIというライブラリを使用してSQLite3と連携している。DBIについて調べているとRuby/DBI ライブラリ・リファレンスに以下のような記述が…

[2021.5] Ruby/DBI はすでに完全に廃れています。'dbi' gem パッケージは 2010 年が最終です。'activerecord' が代替です。

なんてこったい。

ちょっと大変かもしれないが、廃れているDBIを覚えるなら、ActiveRecordで読み替えながらやってみようじゃないか、と思ったわけです。

ActiveRecordのことを調べると大抵はRuby on Railsの記事ばかりでしたが、こちらの記事を見つけた。

[Qiita]Ruby 単体で ActiveRecord を使いたい

この記事ではMySQLを使用しており、せっかくだからMySQLも環境構築してみることにしました。(別記事で環境構築で大変だったことなどを書きます!)

Ruby側でDB接続設定

さて、MySQL側でデータベース作成やテーブル作成が済んだら、Ruby側でDBの接続設定を記載します。

require 'active_record'

ActiveRecord::Base.establish_connection(
    adapter:  'mysql2',
    host:     'localhost',
    username: '<user_name>', # 設定したユーザー名またはroot
    password: '<password>',  # 設定したパスワード
    database: '<database_name>' # 使用するデータベース名
)

これで準備したMySQLのデータベースと接続することができます。

ただ、毎回これを書くのは面倒だし、Git等でバージョン管理する上で、パスワード直書きはなんだか怖い。

もう少し調べてみると、yamlファイルにこれらの設定を書き出してRuby側でyamlファイルを読み込むことで、データベースへの接続を行う方法をとっている方もいました。

yamlファイルに接続設定を記載する方法

まずはdatabase.ymlを作成。

db:
  sample:
    adapter: 'mysql2'
    host: 'localhost'
    username: '<user_name>', 
    password: '<password>',
    database: 'sample' 

  bookinfos:
    adapter: 'mysql2'
    host: 'localhost'
    username: '<user_name>', 
    password: '<password>',
    database: 'bookinfos' 

のように記載しておく。

Ruby側では以下のように記載してデータベースと接続する。

require 'yaml'
require 'active_record'

# データベースに接続する

config = YAML.load_file('<yamlファイルへのパス>')
ActiveRecord::Base.establish_connection(config['db']['sample'])

接続完了パチパチ

これでデータベースとは接続できたわけだけど、少し気になることがありました。

Railsで同じようにyamlファイルにDBの接続設定を書き出して接続している人のコードだと、ActiveRecord::Base.establish_connection(config[db:]['sample'])みたいに、dbのところをシンボルで渡しているんですよね。

最初、それを真似してシンボルで書いたらエラーが出ました。

Rubyyamlライブラリでyamlファイルを読み込んで、出力するとわかるのだが、中身はハッシュになっている。しかもハッシュのキー、つまり先ほどのdbの部分は文字列でした。

それで文字列を渡さないとエラーが出ちゃうんだね。

調べてみると、Railsの方ではHashクラスをいじってあるらしくて、そのおかげでシンボルを渡して接続することができているみたい。

余談

とりあえず接続できればいいじゃんって言う人にとってはどうでもいい内容なのかもしれないけど、こういったことを知ることができてよかった。

Rubyって動的型付け言語だからデータ型を意識することって少ないのかも知れないけれど、だからこそメソッドがどういうデータの型を返すのか、とか返されたハッシュのキーはシンボルなのか文字列なのか、とかそういったことを意識することが大事なんだと思います。

これらを意識していると、不意に「引数がちょっとおかしいぞ」っていうエラーが出た時などの対応力がついてくるんじゃないかな、と思います。メソッドの内容を噛み砕いて説明してあるブログ(スクールが書いてるブログ等)にはあんまり載っていないんですよね、こういうこと。

公式リファレンスにはこのような情報がしっかり書かれています。何か新しいメソッドとか、わからないことがあったらまずはリファレンスに帰る!それでも分かりにくいことがあったら、噛み砕いて書いてくれてある記事やQiitaなどを参考にしてみるといいかもしれませんね。

ちょっと長くなってしまいましたが、これで生RubyActiveRecordを使ってみる(接続編)はおしまいです!ありがとうございました。Rubyたのしい!

参考: Ruby3.1 リファレンスマニュアル library yaml | プログラマーのためのYAML入門(初級編)