Rails
api

APIで複数通貨のレートを効率よく完全自動でデータベースに登録する方法! メンテナンスも簡単!

概要

以前の記事seed.rbの使い方 railsでAPIから取得したjsonデータをDBに自動登録では、currencylayerのAPIを利用して一つの通貨を基に複数の通貨のレートを取得し登録したが、今回はそれを複数の通貨を基にしたレートを取得し、さらに通貨が増えても簡単にメンテナンスできるように改良した。

コード

前回の記事で書いたコードは通貨を変更するときは、URLの編集が必要であった。
また、USDJPYとJPYUSDといった変換先が逆転するデータも登録する場合、新たにURLを書かなくてはいけなかった。
今回のコードでは、eachを2回組み込むことで、完全自動で変換先が逆転したデータまで登録できる。
また、通貨を追加する際にも、sourcesの配列に追加するだけで、メンテナンスも簡単である。

sample.rb
ENV["SSL_CERT_FILE"] = "app/controllers/cacert.pem"
      require 'open-uri'
      sources = ["USD","JPY","EUR","CNY","KRW","THB"]
      currencies = sources.join(',')#配列を文字列に変換
      sources.each do |source| #変換元(source)を順番に繰り返す。
          res = open('https://apilayer.net/api/live?access_key=アクセスコード&currencies=' + currencies + '&source=' + source + '&format=1')
          code, message = res.status # res.status => ["200", "OK"]
          if code == '200'
            result = ActiveSupport::JSON.decode res.read
            @result = result['quotes'] #返ってきたjsonデータをrubyの配列に変換
            @result.each do |key, value| #jsonの通貨ごとに登録を繰り返す。
               rate = Exchange.find_or_create_by(currency: key)
               rate.update(currency: key, rate: value)
            end
          else
            puts "Error!! #{code} #{message}"
          end
        end
      end

感想

かなりきれいに実装できたので良かった(うれしかったので記事にしました。笑)
eachの使い方などがパッと思いつくようになり、エンジニアの思考回路に近づいた気がする。
今度は、これをheroku上で毎朝定期的に実行するような実装をする予定。