# 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