Тип данных для валюты с использованием Mongoid - PullRequest
12 голосов
/ 05 ноября 2010

Полагаю, поплавки не идеальны для валюты.Mongoid поддерживает Float и BigInteger.Каков наилучший подход для хранения и работы со значениями валюты?

Ответы [ 3 ]

6 голосов
/ 08 ноября 2010

Возможно, вы захотите взглянуть на Money gem .

. Как это работает, это представлять денежные суммы в центах и ​​использовать целые числа.Вы можете пойти по этому пути и сохранить свои данные как целочисленные, чтобы вам не приходилось иметь дело с точностью Float.

1 голос
/ 22 февраля 2013

Что говорит Симона.

Я только что вставил драгоценный камень денег в свой проект, и вы также можете сохранить его как тип денег.

class Product
  include Mongoid::Document

  field :price,    type: Money
end

Money.class_eval do

  # Converts an object of this instance into a database friendly value.
  def mongoize
    [cents, currency.to_s]
  end

  class << self

    # Get the object as it was stored in the database, and instantiate
    # this custom class from it.
    def demongoize(object)
      cur = object[1] || Money.default_currency
      Money.new(object[0], cur)
    end

    # Takes any possible object and converts it to how it would be
    # stored in the database.
    def mongoize(object)
      case object
      when Money
        object.mongoize
      else object
      end
    end

    # Converts the object that was supplied to a criteria and converts it
    # into a database friendly form.
    def evolve(object)
      case object
      when Money then object.mongoize
      else object
      end
    end
  end

end   
0 голосов
/ 05 ноября 2010

Поплавки отлично подойдут для валюты, если вы на самом деле не используете дробную часть, то есть если вы сохраняете только предварительно масштабированные целые значения. Float хранит целые числа и выполняет целочисленные операции точно.

Конечно, в этот момент вы могли бы также использовать целые числа.

...