6

Web アプリには 2 つのテーブルがあります。1 つは寄付者 (「寄付者」と呼ばれます) 用で、もう 1 つは寄付金額 (「寄付」と呼ばれます) 用です。寄付者をクリックすると、すべての寄付が表示されます。

特定の慈善団体のために、特定の日付に関連付けられた値を平均しようとしています。たとえば、ドナー 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 を初めて使用するので、これが正しい方法であるかどうかは完全にはわかりません。このトピックに触れている投稿は他にもいくつかありますが、問題の解決に役立ったものはありません。どんな助けでも大歓迎です!

4

1 に答える 1

9

これを行う最も簡単な構文は次のとおりです。

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

これは、形式のハッシュを返します{ 'donatedate' => 'average donateamount' }

has_many :donations当然、これはモデルに関連付けがあることを前提としていますDonor。再利用可能なメソッドは次のようになります。

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 - グループ化された値を計算する

于 2013-05-06T15:11:56.007 に答える