【问题标题】:Average values by group分组平均值
【发布时间】:2013-05-06 15:05:02
【问题描述】:

我的网络应用中有两张表格:一张用于捐赠者(称为“捐赠者”),另一张用于捐赠金额(称为“捐赠”)。当您点击捐赠者时,您可以看到他们的所有捐赠。

我正在尝试为特定慈善机构对与特定日期相关的值进行平均。例如,如果捐赠者 A 存在这些记录:

        *Donor A*

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

我希望系统也计算并显示 05/04/2013 的平均捐款金额为 35,而 05/05/2013 的平均捐款金额为 45。

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

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

这似乎不起作用。由于我是 Rails 的新手,我不完全确定这是否是正确的方法。还有一些其他的帖子涉及这个主题,但没有一个可以帮助我解决这个问题。任何帮助将不胜感激!

【问题讨论】:

    标签: ruby-on-rails date group-by average


    【解决方案1】:

    最简单的语法是:

    @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
    

    要直观地看到这一点,您可以在控制器中调用它:

    @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 - calculate grouped values

    【讨论】:

    • 最后一个问题,我保证!如果我在表格中添加“年龄”之类的列,并希望在我的 html 表格中显示每个日期的平均金额和平均年龄,我需要在我的模型和控制器中进行哪些更改?
    • 什么是age 捐款?这是您的捐赠模型的属性吗?
    • 或者一般来说,如果我想在捐赠者表中添加另一列并以与平均捐赠金额相同的方式进行平均,我将如何去做?
    • 单个捐赠者不能有一个“平均”年龄 - 他们只有一个年龄,而您为检索平均捐赠而编写的代码是针对单个捐赠者的。也许用您想查看的一些示例数据和示例输出来更新您的问题,以便我更好地理解。更好的是,如果涉及与原始内容的实质性更改,请将此问题作为一个单独的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-27
    • 2018-11-29
    • 1970-01-01
    • 2019-05-18
    • 2023-02-21
    • 2016-11-29
    • 2016-08-01
    相关资源
    最近更新 更多