class Danconia::Stores::ActiveRecord

Store implementation that persist rates using ActiveRecord.

Public Class Methods

new(unique_keys: %i[pair], date_field: nil) click to toggle source

@param unique_keys [Array] each save_rates will update records with this keys' values @param date_field [Symbol] used when storing daily rates

# File lib/danconia/stores/active_record.rb, line 7
def initialize unique_keys: %i[pair], date_field: nil
  @unique_keys = unique_keys
  @date_field = date_field
end

Public Instance Methods

rates(**filters) click to toggle source

Returns an array of maps like the one it received.

# File lib/danconia/stores/active_record.rb, line 27
def rates **filters
  ExchangeRate.where(process_filters(filters)).map { |er| er.attributes.symbolize_keys }
end
save_rates(rates) click to toggle source

Creates or updates the rates by the `unique_keys` provided in the constructor.

@param rates [Array] must be an array of maps.

# File lib/danconia/stores/active_record.rb, line 15
def save_rates rates
  ExchangeRate.transaction do
    rates.each do |fields|
      ExchangeRate
        .where(fields.slice(*@unique_keys))
        .first_or_initialize
        .update(fields.slice(*ExchangeRate.column_names.map(&:to_sym)))
    end
  end
end

Private Instance Methods

process_filters(filters) click to toggle source
# File lib/danconia/stores/active_record.rb, line 33
def process_filters filters
  if @date_field
    param = filters.delete(@date_field) || Date.today
    last_record = ExchangeRate.where(filters).where("#{@date_field} <= ?", param).order(@date_field => :desc).first
    filters.merge(@date_field => (last_record[@date_field] if last_record))
  else
    filters
  end
end