💬

Her - RESTのリソースをRubyオブジェクトにマッピングするORM

2023/04/05に公開

おはようございますこんにちはこんばんは。
スペースマーケットでWebエンジニアをしているs0arです。

今日はgemに脳を破壊されたエンジニアの話をします。

経緯

社内のRailsのコード読んでたら以下のようなコードに出くわしました。

@user.items.where(status: params[:status]).find(params[:id])

ActiveRecordかな?
おじさんはそう思いました。

でも違いました。実はこれ、REST API経由でデータを取ってきてるんですね。

無事1人のエンジニアの脳が破壊されました。

Herとは

https://github.com/remi/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との連携とかで威力を発揮しそう
  • 世の中知らないことばっか

おわりに

弊社では一緒にサービスを盛り上げていく仲間を募集中です。
少しでも「気になる!」と思ったあなた、カジュアルにお話しませんか?

https://www.wantedly.com/projects/1113570
https://www.wantedly.com/projects/1113544
https://www.wantedly.com/projects/1061116

GitHubで編集を提案
スペースマーケット Engineer Blog

Discussion