#概要
以前の記事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=アクセスコード¤cies=' + 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上で毎朝定期的に実行するような実装をする予定。