ActiveRecordを単体で試すためのテンプレートを作る
はじめに
勉強だったり仕事でRailsやActiveRecordのソースを読んでるうちに手元で動かしたくなる事が多いのでActiveRecordを単体で扱えるテンプレートを作成してみた。
やった事
詳細はGithubに
動作確認が主な目的でデータを永続化する必要がないので手軽さを優先してDatabaseはSQLite3をin memoryで使用。
Modelを動かすのに必要な処理を分けておいたので必要なテストデータを順次追加していく。 手順の流れはRailsと大体同じでschemaに定義をmodels以下にmodelファイル、テストデータはseed.rbに追加する。
- schem.rb
- models/
- seed.rb
とりあえずhas_one、has_many、valiadtionあたりを確認出来るようにファイルとseedを追加しておいた。
デバッグして挙動も見たいのでデバッガを追加。
Ruby3からは標準のデバッガが改善されているがRuby2以下を使いたくなる場合を考えてpry-byebugにした。
pry-byebugのbinding.pryはファイルの最終行になるとBreakpointとして働いてくれなくなるので
puts 'finish'
を挿入。標準の新しいデバッガのbinding.breakだと最終行でも止まってくれるので後々移行するかも。
あとは puts 'finish'
の上に試したいコードを書くなりデバッガを貼るなりして実行する。
bundle exec ruby main.rb
まとめ
has_manyやhas_oneだったりActiveRecordの挙動を確認したくなった際にModelを書いて、テストデータを作成してーというの都度考えるのが面倒なのでまとめてしまった。 CallbackとかObserverとか他にもあるがまた試したくなった時に追加する予定。
Rubyでコマンドを作る環境を整えてみる
はじめに
普段の仕事でほぼ毎日Rubyを書いているがもっぱらRailsばかりなのでもっと気軽にスクリプトを書いていこうと思い。Rubyで書いたプログラムをコマンドとして呼び出せる環境を考えてみた。
やった事
gem i thor
コマンドとして実行したいので実行ファイルにはshebangをつけて拡張子なしで/binに、本体は/lib以下に分けて置くディレクトリ構成にする
~/scripts/lib/thor_sample/thor_sample.rb ~/scripts/bin/thor_sample
最低限やりたい事を試すためにサンプルのスクリプトを作成
thor_sample.rb
require "thor" module ThorSample class CLI < Thor desc "command", "print 'thor sample'" def command puts "thor sample" end desc "command2", "print 'hulk sample'" def command2 puts "hulk sample" end end end
bin/thor_sample
#!/usr/bin/env ruby require 'thor' require_relative '../lib/thor_sample/thor_sample' ThorSample::CLI.start(ARGV)
pathを通して実行権限を付与
echo 'export PATH="$HOME/scripts/bin:$PATH"' >> ~/.zprofile source ~/.zprofile chmod 755 ~/scripts/bin/thor_sample
$thor_sample command thor sample $thor_sample command2 hulk sample
気軽にスクリプトを呼び出すのが目的なのに毎回必ず引数を渡さないといけないは面倒なのでデフォルトのコマンドを設定する。
最初はbinファイルの中でARGVが空ならデフォルトコマンドを入れた配列を渡そうと思ったがThorでdefault_taskが設定出来たので素直にこれを使用する。
class CLI < Thor default_task :command ~ end
$thor_sample thor sample
これでRubyで書いたプログラムをコマンドとして実行出来るようになった。あとは自分で作りたいと思ったプログラムを追加していくだけ。
仕事でフレームワークを使っていると書いているプログラムの範囲が限定される。
それはそれで良いのだがたまに自分の頭で思いついたアィディアでなにかが実現出来た時は嬉しいので、これでプログラムを楽しんで書く事が捗ればよいと思う。