# desc “Explaining what the task does” # task :exchange_rates do # # Task goes here # end require 'money' require 'money/bank/open_exchange_rates_bank' namespace :exchange_rates do
desc 'update exchange rate' task update: :environment do puts '*****************************************' puts '--- update start ---' oxr = Money::Bank::OpenExchangeRatesBank.new oxr.app_id = ENV['OPEN_EXCHANGE_RATES_APP_ID'] oxr.update_rates oxr.ttl_in_seconds = 86400 Money.default_bank = oxr currencies = Money::Currency.table.map{|c| c[0].to_s.upcase} currencies.delete('') currencies.each do |currency| begin exchange_rate = ExchangeRates::Rate.find_or_initialize_by(from_currency: currency) # Money gem method#from_amount is from dollar exchange_rate.rate_to_base_currency = Money.from_amount(100000000, currency).exchange_to(ExchangeRates::Rate::BASE_CURRENCY).dollars.to_f / 100000000 if exchange_rate.new_record? || exchange_rate.changed? exchange_rate.save puts "--- #{currency} has been updated---" puts '*****************************************' puts "--- Clean Cache: #{currency.downcase}_to_#{ExchangeRates::Rate::BASE_CURRENCY.downcase}---" Rails.cache.delete("#{currency.downcase}_to_#{ExchangeRates::Rate::BASE_CURRENCY.downcase}") else puts "--- nothing to update for #{currency} ---" end rescue Exception => e puts "#{currency} cannot be fetched!" puts e end end end # update
end