みんなの「作ってみた」

【個人開発】Railsで生SQLを多少マシに書けるgemを作ってみた

2019/01/31

yu-croco
yu-croco
バックエンド(Ruby/Golang/node.js/AWS)を中心に扱っています。副業などのご連絡は掲載しているemailへお願いいたします。
arelableというgemを作りました。
まだrubygemsで公開してません。近日中にやろうと思います。
下記に公開しました。

https://rubygems.org/gems/arelable

背景

  • 個人開発で何か作ってみるかな〜と考えていたけれど、webサイト作るのはメンテとか面倒&すぐにはアイデアがなかったのでライブラリー作るか、となりました。
  • 下記の理由から、従来生のSQLを書いていた処理を多少マシにかけるようなラッパーgemを作りました。
    • そういえば、Railsのモデルで比較(>とか<など)やlike を使う場合は生のSQLを書く必要があってイケてないなーと思ってた
      • そのうち、Rails側でサポートしてくれるメソッドができてもいいんじゃない?なんて思ってたけど出てこない...
    • ArelあるけどprivateなAPIだから依存したくないなぁ

実装方法

  • 単純に従来書いている生のSQL文をラップする処理を書きました。大したことはしてません。 
  • ActiveRecord::Concernを利用したモジュールを作り、それをActiveRecord::Baseに対してextendしています

使い方

(gem公開してからの話ですが、、) 対象のモデルにArelableをincludeした上でお使いください。

class User < ActiveRecord::Base
  include Arelable #<= これでok
end

gt

User.gt(:age, 35)
# => SELECT COUNT(*) FROM `users` WHERE (age > 35)

gteq

User.geteq(:age, 35)
# => SELECT COUNT(*) FROM `users` WHERE (age >= 35)

lt

User.lt(:age, 35)
# => SELECT COUNT(*) FROM `users` WHERE (age < 35)

lteq

User.lteq(:age, 35)
# => SELECT COUNT(*) FROM `users` WHERE (age <= 35)

bw

User.bw(:age, [35, 40])
# => SELECT COUNT(*) FROM `users` WHERE (age BETWEEN 35 AND 40)

matches

User.matches(:name, "Bo")
# => SELECT COUNT(*) FROM `users` WHERE (first_name LIKE '%Bo%')

所感

  • ショボイなりにゼロから何か作ってみると、けっこう楽しい。
  • もう少し機能のバリエーションとエラー処理とかちゃんとつけたい。
  • テスト/CI環境を作るのが大変だった&勉強になった。
    • active_recordだけ(railsなし)でDB接続したり、マイグレーションしたり、モデル操作とかどうするんだろうという所の知見が多少ついた
    • Railsで普段bin/rails db:migrate とかしててほんと楽だぁなと..
  • ご意見ご感想(こんな機能あったらいいんじゃね?なども)などありましたら、(優しめに)お願いいたします。

参考