Rails 圆形 Active Record 查询结果

问题描述 投票:0回答:3

我似乎无法弄清楚的简单问题:

在控制器中:

@clientsMonthYearQuery = Client.group(:month_year)

在视图中我有这个查询

@clientsMonthYearQuery.average(:charge)

如何对查询结果进行四舍五入,将平均值四舍五入到小数点后两位?

*注意,在视图中链接 AR 计算有商业原因,我给出的示例是根据实际情况进行简化的

ruby-on-rails activerecord
3个回答
1
投票

我刚刚在尝试用 Chartkick 做同样的事情时遇到了这个。我将结果转换为一个数组(实际上是一个数组数组,其中每个子数组都是 [client,charge]),然后舍入每个子数组中的第二个值,如下所示:

@clientsMonthYearQuery.average(:charge).to_a
@clientsMonthYearQuery.each do |record|
  record[1] = record[1].round(2)
end

但是我在控制器中执行此操作。您当然可以将结果保留为散列并以类似的方式对其进行迭代,但我更喜欢数组(chartkick 接受两者),这对我有用。


0
投票

您可以对 ActiveRecord 查询返回的数字进行四舍五入,如下所示:

@clientsMonthYearQuery.average(:charge).round(2)

如果您在视图中执行此操作,您也可以使用这个方便的 Rails Helper:

<%= number_with_precision @clientsMonthYearQuery.average(:charge), :precision => 2 %>

0
投票

您可以使用

select
通过数据库进行舍入,而不是强制 Ruby 进行舍入(Ruby 速度较慢)。

class Client

  scope :average_charge_by_month_year, -> do
    group(:month_year)
      .select(
        :month_year, 
        'ROUND(AVG(charge)) AS average_charge'
      )
      .order('average_charge DESC')
  end

  class << self

    def average_charge_by_date
      average_quantity_by_product_name.to_a.pluck(
        :month_year,
        :average_charge
      )
    end
    
  end
  
end

那就拨打:

Client.average_charge_by_date

您将收到一个包含month_years和四舍五入平均费用的数组。
(如果您想要哈希,请不要使用

.to_a.pluck
,只需使用
map
to_h
代替。)

此外,此查询按四舍五入平均值排序,这又节省了时间。

© www.soinside.com 2019 - 2024. All rights reserved.