MicroCMSのAPIをActive Recordぽく扱えるRubyライブラリ作ってみた
なぜ作ったか
MicroCMS便利ですよね。自分も運営しているサイトの一つで使わせてもらっています。
MicroCMSでは、Webダッシュボードが提供されていますが、エンジニア的にはAPIで触れた方が、データをまとめて触ったり整形したりするときには便利です。
MicroCMSでは主たる言語のSDKが公式で用意されており、自分の場合はRubyのものを使っていました。
ところが、Filterの書き方等を毎回忘れてしまい、使う度に調べる→忘れる→調べるを繰り返していて、普段触っている Active Record のように触れればなと思っていたのでした。
作ったもの概要
以下のように、1つのAPI=1つのモデルのような感じで、クラスを定義し、そのクラスの属性としてAPIのフィールドの値を扱うことができます。
require "mc_record"
# Credentials
McRecord::Base.config(
service_domain: "[Domain Name]",
api_key: "[API Key]",
end_point: "[End Point]"
)
# Define a class that inherits `McRecord::Base`
class Content < McRecord::Base
end
# Examples
content = Content.find("[ID]") # => Content
# MicroCMS API fields can be read/written as attributes of defined classes.
puts content.name
content.category = ""
# Other Methods.
Content.all # => Array<Content>
Content.where(category: "[Name of Category]") # => Array<Content>
サポートしている機能
とりあえずデータ取得・検索関連の機能が欲しかったので、以下のメソッドを使えるようにしています。(ただし、後述のように実際のActive Recordの機能に比べると非常に貧弱です)
all
find
where
サポートしていない機能
実際のActive Recordは、特にActiveRecord::Relationはメソッドチェーンや遅延ロード等、非常に便利で多岐にわたる機能が提供されていますが、それらの機能は実装されていません。
上記の all
メソッド等も、本来のActive Recordの返り値は ActiveRecord::Relation を継承したオブジェクトですが、現在は単純に対象のAPIのオブジェクトの配列が返るだけです。
また save
のようなデータ保存系の機能はサポート出来ていません。(こちらは単純な機能ならそんなに実装が大変な類いでは無いので、必要に迫られれば実装するかもしれません)
関連してActiveModelの提供しているようなバリデーション機能もありません。
おわりに
というわけで、 Active Record ぽくと書いた割には非常に表面的な機能だけですが、とりあえずいつものインターフェースでデータを手っ取り早く手元にロードしたかったので、最低限だけ実装してみました。
今後、使いながら少しずつ機能を拡充していければと思います。
参考
Discussion