module Amountable::ClassMethod
Public Instance Methods
allowed_amount_name?(name)
click to toggle source
# File lib/amountable.rb, line 110 def allowed_amount_name?(name) self.amount_names.include?(name.to_sym) end
amount(name, options = {})
click to toggle source
# File lib/amountable.rb, line 94 def amount(name, options = {}) (self.amount_names ||= Set.new) << name define_method name do (find_amount(name) || Amountable::NilAmount.new).value end define_method "#{name}=" do |value| set_amount(name, value) end Array(options[:summable] || options[:summables] || options[:set] || options[:sets] || options[:amount_set] || options[:amount_sets]).each do |set| amount_set(set, name) end end
amount_set(set_name, component)
click to toggle source
# File lib/amountable.rb, line 86 def amount_set(set_name, component) self.amount_sets[set_name.to_sym] << component.to_sym define_method set_name do get_set(set_name) end end
pg_json_field_access(name, field = :cents)
click to toggle source
# File lib/amountable.rb, line 140 def pg_json_field_access(name, field = :cents) name = name.to_sym group = if name.in?(self.amount_names) 'amounts' elsif name.in?(self.amount_sets.keys) 'sets' end "#{self.amounts_column_name}::json#>'{#{group},#{name},#{field}}'" end
where(opts, *rest)
click to toggle source
Calls superclass method
# File lib/amountable.rb, line 114 def where(opts, *rest) return super unless opts.is_a?(Hash) if self.storage == :jsonb where_json(opts, *rest) else super end end
where_json(opts, *rest)
click to toggle source
# File lib/amountable.rb, line 123 def where_json(opts, *rest) values = [] query = opts.inject([]) do |mem, (column, value)| column = column.to_sym if column.in?(self.amount_names) || column.in?(self.amount_sets.keys) mem << "#{self.pg_json_field_access(column, :cents)} = '%s'" mem << "#{self.pg_json_field_access(column, :currency)} = '%s'" values << value.to_money.fractional values << value.to_money.currency.iso_code opts.delete(column) end mem end query = [query.join(' AND ')] + values where(query, *rest).where(opts, *rest) end