求和Mongoid BigDecimal

时间:2013-05-31 10:43:06

标签: ruby-on-rails-3 mongoid

Mongoid 3文档显示您可以使用以下内容进行简单求和:Band.sum(:likes)

我有以下简单模型:

class Project
  ...
  has_many :subprojects
  ...
end

class Subproject
  ...
  field :subtotal, :type => BigDecimal, :default => 0
  ...
end

如何在每个subtotal中汇总Project

例如,我试过

Project.first.subprojects.sum(:subtotal)它返回0.

但是 Project.first.subprojects.first.subtotal返回#<BigDecimal:7fcb0d77b958,'0.11054E3',18(18)>

有什么建议吗?

2 个答案:

答案 0 :(得分:4)

我测试了Mongoid如何存储BigDecimal

rails c

class Test
  include Mongoid::Document
  field :decimal, type: BigDecimal
end
test = Test.new
test.decimal = BigDecimal.new(123, 456)
test.save

然后我查询了数据库:

> db.tests.find()
{ "_id" : ObjectId("52e0ed4bb2e8c9ea34000001"), "decimal" : "123.0" }

您清楚地看到BigDecimal存储为字符串,从而解释了为什么您不能sum它。


但是,您可以尝试解析它,然后使用map / reduce总结它:

map = %Q{
  function() {
    emit("BigDecimalSum", { decimal: parseFloat(this.decimal) });
  }
}

reduce = %Q{
  function(key, values) {
    var result = { sum: 0 };
    values.forEach(function(value) {
      result.sum += value.decimal;
    });
    return result;
  }
}

Test.map_reduce(map, reduce).out(inline: true)

我只是测试了mongo客户端中的parseFloat并且它有效,所以这个map / reduce也应该有用。

答案 1 :(得分:-1)

要对Mongoid中的BigDecimal字段求和,请使用#sum的块形式:

sum = 0 Project.first.subprojects.sum do |subproject| sum += subproject.subtotal end