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