使用Mongoid的货币数据类型

时间:2010-11-04 21:04:51

标签: ruby-on-rails ruby ruby-on-rails-3 mongodb mongoid

我猜浮标并不适合货币。 Mongoid支持Float和BigInteger。存储和使用货币值的最佳方法是什么?

3 个答案:

答案 0 :(得分:6)

您可能希望查看Money gem

它的工作方式是以美分表示金额并使用整数。 您可以按照这种方式将数据存储为整数,这样就不需要处理Float精度。

答案 1 :(得分:1)

西蒙娜说的话。

我刚刚在我的项目中插入了money gem,你也可以将它存储为Money类型。

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   

答案 2 :(得分:0)

如果您实际上没有使用小数部分,也就是说,如果您只存储了预分频积分值,则浮点数对于货币可以正常工作。 Floats存储整数并完全执行整数运算。

当然,那时你也可以使用整数。