Her - RESTのリソースをRubyオブジェクトにマッピングするORM
おはようございますこんにちはこんばんは。
スペースマーケットでWebエンジニアをしているs0arです。
今日はgemに脳を破壊されたエンジニアの話をします。
経緯
社内のRailsのコード読んでたら以下のようなコードに出くわしました。
@user.items.where(status: params[:status]).find(params[:id])
ActiveRecordかな?
おじさんはそう思いました。
でも違いました。実はこれ、REST API経由でデータを取ってきてるんですね。
無事1人のエンジニアの脳が破壊されました。
Herとは
これです。
Her is an ORM (Object Relational Mapper) that maps REST resources to Ruby objects.
It is designed to build applications that are powered by a RESTful API instead of a database.
(意訳: HerはRESTのリソースをRubyオブジェクトにマッピングするORMやで〜RESTful APIをデータベース代わりに使うアプリケーションのために設計されてるやで〜)
アッハイ
つかいかた
READMEに記載があるので触れなくても良い気はしますが触れないとこの記事終わっちゃうのでね。
config/initializers/her.rb
に以下のような初期化コードを書きます。
Her::API.setup url: "https://api.example.com" do |c|
# Request
# ここではRequest時に必要なものをuseします
# なんかURLエンコードとか認証トークンをセットするとかそういうのです
c.use Faraday::Request::UrlEncoded
# Response
# ここではResponseを処理するときに必要なものをuseします
# なんかParserとかです
c.use Her::Middleware::DefaultParseJSON
# Adapter
# ここは基本的にこれだけで良さそう(HTTPクライアントの記述)
c.use Faraday::Adapter::NetHttp
end
そして、以下のようなファイルを作ります。
class UserResource
include Her::Model
end
これで準備できました。
データ取得、更新はこんな感じです。
# 全件(GET /users)
users = UserResource.all
# 対象idのuserを取得(GET /users/1)
user = UserResource.find(1)
# whereで絞り込んだりもできる(GET /users?status=active)
users = UserResource.where(status: "active")
# 取得したリソースの更に子どもをとってきたりもできる(GET /users/1/items)
user = UserResource.find(1)
user_items = user.items
# 対象userのnameを更新(POST /users/1)
user = UserResource.find(1)
user.name = 'Jiro'
user.save
もちろん、API側がちゃんと実装されてないとダメです。
このコードでまさかREST APIにリクエストしてるなんて思いますか…?
なんかこう…すごい(KONAMI)
まとめ
- Herはすごい(KONAMI)
- 見た目はほぼActiveRecordなのでActiveRecordに慣れていると使いやすいかもしれない
- ただ、ActiveRecordに慣れているとそれがHerだということに気づけない可能性もある
- 自分はこれで小一時間悩みました
- 外部APIとの連携とかで威力を発揮しそう
- 世の中知らないことばっか
おわりに
弊社では一緒にサービスを盛り上げていく仲間を募集中です。
少しでも「気になる!」と思ったあなた、カジュアルにお話しませんか?
スペースを簡単に貸し借りできるサービス「スペースマーケット」のエンジニアによる公式ブログです。 弊社採用技術スタックはこちら -> whatweuse.dev/company/spacemarket
Discussion