Origin Selectable extensions

For generating more dynamic queries with Mongoid :)

Usage

gem 'origin-selectable_ext'

Or include in .gemspec file as dependency ;)

Example usage

From the money-mongoid gem (also used in Timespan)

class Money
  class << self  
    def custom_serialization?(operator)
      return false unless operator
      case operator
        when "$gte", "$gt", "$lt", "$lte"
          true
      else
        false
      end
    end

    def custom_specify(name, operator, value, options = {})
      money = value.__evolve_to_money__
      case operator
        when "$gte", "$gt", "$lt", "$lte"
          specify_with_multiple_currencies(name, operator, money, options)
      else
        raise RuntimeError, "Unsupported operator"
      end
    end

    def custom_between(field, value, options = {})
      { "$gte" => ::Money.new(value.min, value.iso_code), "$lte" => ::Money.new(value.max, value.iso_code) }
    end

    def custom_between? field, value
      true
    end

    private

    def specify_with_multiple_currencies(name, operator, value, options)
      currencies = [value.currency.iso_code]
      currencies.concat options[:compare_using] if options && options[:compare_using]
      multiple_money_values = value.exchange_to_currencies(currencies.to_set)
      subconditions = multiple_money_values.collect {|money| specify_with_single_currency(name, operator, money)}
      if subconditions.count > 0
        {"$or" => subconditions}
      else
        subconditions[0]
      end
    end

    def specify_with_single_currency(name, operator, value)
      {"#{name}.cents" => {operator => value.cents}, "#{name}.currency_iso" => value.currency.iso_code}
    end
  end
end

See github.com/mongoid/origin/issues/47 for more details.

Contributing to origin-selectable_ext

Copyright © 2012 Kristian Mandrup. See LICENSE.txt for further details.