按组计算的平均值

6

我在我的Web应用程序中有两个表格: 一个是为捐赠者(称为“donors”)而设计的,另一个是为捐赠金额(称为“donations”)而设计的。当您单击捐赠者时,您可以查看他们所有的捐赠记录。

我正在尝试计算与特定日期和慈善机构相关联的值的平均值。例如,如果这些记录存在于捐赠者A的记录中:

        *Donor A*

   Date       Donation Amount
05/04/2013          30
05/04/2013          40
05/05/2013          15
05/05/2013          75

我希望系统还能计算并显示出2013年5月4日的平均捐款金额为35美元,以及2013年5月5日的平均捐款金额为45美元。

目前我已经在我的捐赠者模型中尝试使用组(group)属性:

def self.average_donateperdate
    Donation.average(:donateamount, conditions: ["donor_id = ?", @donor], group: "donatedate")
end

这似乎不起作用。由于我是Rails的新手,我并不确定这是否是正确的做法。有一些其他帖子涉及到了这个话题,但没有一个能帮助我解决问题。非常感谢您提供任何帮助!

1个回答

9

最简单的语法是:

@donor.donations.group(:donatedate).average(:donateamount)

这将以格式{ 'donatedate' => 'average donateamount' }返回一个哈希表。

当然,这假定你的Donor模型有一个has_many :donations关联。一个可重用的方法应该如下所示:

def average_donation_by_date
  donations.group(:donatedate).average(:donateamount)
end

现在你可以简单地调用:

@donor.average_donation_by_date

为了更好地理解,您可以在控制器中调用以下代码:

要在页面上显示数据,您需要使用HTML标记。例如:

@average_donations = @donor.average_donation_by_date.to_a.sort_by(&:first)

你的视图可能包含类似于以下内容:

<table>
  <thead>
    <tr>
      <th>Date</th>
      <th>Average Donation</th>
    </tr>
  </thead>
  <tbody>
    <% @average_donations.each do |date, amount| %>
      <tr>
        <td><%= date.strftime('MM/dd/yyyy') %></td>
        <td><%= amount %></td>
      </tr>
    <% end %>
  </tbody>
</table>

参考资料

Rails API - 计算分组值


最后一个问题,我保证!如果我向表中添加一个名为“年龄”的列,并且想要在我的HTML表中显示每个日期的平均金额和平均年龄,那么我需要在我的模型和控制器中做出什么改变? - bork121
“age” 是指捐赠的年龄吗?这是您的捐赠模型的属性吗? - PinnyM
或者说,如果我想向捐赠者表中添加另一列,并以与我平均捐赠金额相同的方式进行平均,我该如何操作? - bork121
一个单独的捐赠者不能有“平均”年龄 - 他们只有一个年龄,并且您编写的检索平均捐赠的代码是针对单个捐赠者的。也许您可以更新您的问题,提供一些示例数据和示例输出,以便我更好地理解。更好的方法是,如果这涉及到与原始问题实质性的更改,请将其作为单独的问题提出。 - PinnyM

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接