4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Posted at

#概要
以前の記事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上で毎朝定期的に実行するような実装をする予定。

4
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?