【问题标题】:Get a group of sums without excluding instances where some groups have no entries获取一组总和,不排除某些组没有条目的实例
【发布时间】:2018-02-18 16:17:00
【问题描述】:

现在,我正在尝试将数据库中的一组总和分组到一个二维数组中。就目前而言,代码看起来像这样:

@TwoDArray = Array.new
@eachPossibleValue.each do |specificValue|
        @innerArray= Array.new
        @innerEachPossibleValue.each do |innerSpecificValue|
            @innerArray.push(@database.where(fieldOne: specificValue).where(fieldTwo: innerSpecificValue).sum("y_value"))
        end
        @twoDArray.push(@innerArray)
end

如您所见,每次运行时都会出现一堆 O(n*m) 查询,但它确实有效。它创建特定组合的内部数组,然后将该数组推送到主数组,冲洗并重复所有可能的外部值。我们能够在一个查询中找到一个接近的答案来完成这一切:

@database.group(:fieldOne, :fieldTwo).order("fieldOne", "fieldTwo")
    .pluck("sum(y_value)").each_slice(numberOfUniqueFieldTwoEntries).to_a

这会达到我们想要的效果……我想。它只是获取所有值的大型数组,例如展开的 2D 数组,然后将其切片,因为它是统一的(因为有时没有任何条目只会在其位置产生 0。)

问题是,由于 fieldOne、fieldTwo 的某些组合没有条目,因此它们被跳过了。 each_slice 的幼稚方法不再有效,因为那里没有任何零;他们只是被排除在外。

有没有办法在单个查询中获取这些总和,同时还包括某些组合不产生条目的实例?

【问题讨论】:

    标签: ruby-on-rails arrays ruby activerecord


    【解决方案1】:

    您可以将where.not(:fieldOne => nil) 添加到您的活动记录查询中

    @database.group(:fieldOne, :fieldTwo).order("fieldOne", "fieldTwo").
    where.not(:fieldOne => nil).where.not(:fieldTwo => nil).
    .pluck("sum(y_value)").each_slice(numberOfUniqueFieldTwoEntries).to_a
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-16
      • 2014-07-05
      相关资源
      最近更新 更多